Ask HN: As a senior engineer content with programming chops, what to learn next?
I am a senior software engineer who has been in the field for about 25 years. I mainly use Python and SQL and feel like I can use it to solve mostly all problems. I also have a good knowledge of programming techniques like functional, OO and logic programming. I am aware that as a senior software engineer one has to have other skills like caring about the team overall, and mentoring juniors.
I am wondering what should I learn next. Somebody said I should learn Go or Rust but I feel like if it’s another programming language, its really nothing new. Spend a weekend, do some tutorials and you should be good since you are a senior engineer and you know the basics that underpin programming languages.
What novel thing should I learn next that will enhance my capability as a senior engineer? Or open to my eyes to things that I haven’t considered till now?
I realize this is a vague request but was just wondering if there were other people with the same dilemma.
Thanks in advance!
43 comments
[ 2.5 ms ] story [ 107 ms ] threadYou could maybe characterize what you’re saying as that you’re feeling directionless in your career. You like it, but it feels mature and like you’ve reached a summit. You’re craving a new peak to try climbing but can’t find one that’s appealing.
Maybe somebody will throw out an idea here that will inspire you directly, but my sense is that you may need to shake up how you’re looking at the possibilities. You’re thinking in terms of languages and styles and (rightly, for where you are professionally) feel like those are trivial additions to your repertoire rather than peaks to climb.
So maybe you need to think in some other terms. What do you want to be doing professionally at Year 30? What were some things that inspired you at Year 1 or Year 5 that circumstances pulled you away from — can you revisit those? etc
The second of those questions is on my mind because I felt similar to you last year and was coaxed into refocusing on a fun specialty that my career had long ago pulled me away from. It’s a rich and interesting field and tends to draw in storied people with personalities I enjoy, so it’s been really rewarding to dive back into it whole-heartedly. I feel refreshed in a way I hadn’t expected.
But you might be moved by a different question entirely; my emphasis here is just on maybe asking yourself some different questions than you have been.
This is a weak position in terms of your market value. Obviously python is far from being the best option for many domains outside ML or simple web monoliths. Just like any tech has its applicability areas.
I personally would not consider any developer really “senior” until he got commercial experience with both statically typed and dynamic languages.
It’s not about the typing discipline per se, but rather about whether a developer was exposed to different kinds/levels of challenges (like system programming in java vs building microservices with nodejs).
That said, its not easy to master. normally when I start learning a programming language, my toy problem of choice for a taste of the language is to implement a merge sort.
with elixir -> 1 day swift -> 1 day rust -> 1 week.
rust is significantly harder to learn that any other language I've picked up. including js when I was first learning to code. Its worth it once you start getting it in your head.
Anyways, languages evolve and go out of date anyways. As you know, sql is not going away. I consider it one of the foundational knowlege things. where it doesn't go out of date. I think the next big thing in the course is ML. the libraries might change but the math doesn't. Time invested in learning ml and ai are a long term value generating asset.
just my 2 cents
Learning how to write fast (as in performance) software. So optimizing memory usage, parallel (SIMD/GPU) computing and microarchitecture optimizations.
Everyone can write docs fine, just the way everyone can write code fine. But good docs are a lot of work. The ones that people understand at a glance, instead of having to crawl around. This is something that Google and Oracle can't do, so I don't expect it to be easy.
Also just writing better code. Declarative programming is very easy to read and modify, but can be difficult to think in that way if you're not used to it.
Learn basic statistics. Apply it to performance testing, system modeling.
Build off your knowledge of logic programming -- learn a formal verification language like SMTLIBv2 or TLA+. Apply it to find bugs in code, or to clearly write out algorithm or system designs.
Learn C++ or Rust, and use it to write performant systems code -- the kind of stuff Python can't do. Learn how to convince the CPU, memory, disk, and network to give you all the performance they're capable of. Note, the goal here is not to learn another language. The goal is to learn how to think of programming in terms of interfacing hardware resources together -- as opposed to a pile of functions that compute something.
How and where do you learn this? Can you link some resources?
You'll be forced to learn how to multiplex I/O streams. How to minimize memory copies. How to efficiently allocate and reuse memory. How to minimize system call overhead. What the more esoteric I/O system calls are. How to minimize pipeline stalls, cache and TLB misses. Which tools to use to measure all this stuff. If you're not finding these techniques necessary -- make the problem harder by raising the specs, limiting the resources more, or making the problem more involved (say -- build an flow index online for efficient seeking within the recorded data).
(This was basically my first major software project that forced me to learn performance optimization up and down the stack.)
Any resources for applying stats knowledge to these topics?
What caught my eye was that you use logic programming. Would you mind sharing what your use case is and how it fits your Python workflow?
Sorry if this wasnt what you were looking for :)
I am a Senior as well and I personally am never happy with my programming ability - until you're Carmack (or insert one of your favourite programmers), there's something to learn.
I predominantly have written TypeScript over the last several years and Rust taught me that as great as TypeScript is, it has coddled me completely and actually deprived me of much knowledge.
Like, how exceptionally bad 90% of programmers are at dealing with errors because they are garbage in most languages. You can only learn how to do that properly once you see it done, well, properly.
The idea that once you've done Python you've done them all is hilarious. I don't know how someone could be programming for 25 years and not realise that!
I have also familiarized myself with formal verification and proof assistants. They are in the class of "weekend projects to get myself familiar with them but I dont see myself putting them into practice right away". I do love functional programming and most of the Python code I write has a functional style, since I have experienced immense benefits with that.
Here's a good start:
https://www.nand2tetris.org
Since you would probably will not do that, my second best suggestion is to learn a language which can do what python can't or not in a straightforward way... for example:
- be performant or elegant... or
- easy to deploy/distribute... or
- have better out of the box dependency management
- not be complete and utter garbage
Just mentioning that for every one of you, there probably is one of me :)
plug: I made an educational project which can help you write a database in python, from scratch - https://github.com/avinassh/py-caskdb
Firstly, thanks for the great comments and suggestions. Its always worth it to ask fellow HN-ers about things and get their opinions.
Secondly, I want to clear some misconceptions that seem to have arisen based on how I worded some things. It was suggested that its foolish to think that once one knows Python, they have learnt all languages. I could not agree more. What I meant was that Python is my language of choice to turn a problem into code. I am not naive enough to suggest that I can solve any problem with Python. Regarding my experience, I first started programming in VB (not even VB.NET, that's how far back my experience goes!), and over the years have deployed applications in C, Java, .NET and Clojure in production. I have familiarized myself quite a bit with functional programming languages like Haskell and Ocaml. I have also worked with SQL and no-SQL databases (25 years is a long time!). I am fully aware of the pros and cons of statically-typed systems, so I don't feel the need to learn yet another statically (or for that matter dynamically) typed language.
And lastly, based on the wonderful suggestions, I feel like I could narrow down my next learning journey into one (or more) of the following. I am stating these just in case they could be of use to someone in the same boat:
- Networks was suggested (thank you!) which really piqued my interest but I am thinking it might be better to get more specific and be intimately familiar with HTTP spec and best practices in API development. Methods to enable an API for any backend functionality seems to be a good skill to possess.
- Documentation - how to easily enable documentation for functionality, and basic tenets of good software documentation. Learn to introduce practices in the team that foster a culture of documentation.
- ML. I have learnt the very preliminary basics of this (using the seminal course by Andrew Ng!) but what I feel might be useful for me is to be a bridge between ML scientists and data engineering (I am a data engineer currently). Basically something related to ML Ops.
Again, thanks for these amazing suggestions. HN never fails me. I am not very active on HN, but hope to help out in future.
P.S: I will also respond to specific comments/questions to clarify. Seems wrong to leave some comments in the current state! :)
Very much like programming, the only way to learn marketing is by doing it. You can read and Youtube your whole life, but it's only when you decide you're going to put it in practice that you discover that what marketing actually demands is courage. It takes courage to put yourself and your product out there, and it doesn't even matter what that product is. It could be a newsletter, it could be a software project, it could be a side hustle, it could be your twitter account.
You can get started by listening to some of Seth Godin and Jay Abraham, at least to see marketing for what it really is.
In every one of these projects as soon as you want decent performance for reasonable input sizes you'll either need to switch languages and/or get much better at data structures & algorithms.
All of these have references you can follow easily online (except for software rendering and implementing TCP/IP, at least from my searches).
Outside of these topics you can do on your own, joining a large company with data and compute scaling challenges is always a great way to grow personally.