Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: As a senior engineer content with programming chops, what to learn next?
25 points by captmorrel on June 18, 2022 | hide | past | favorite | 42 comments
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!




Learn how networks work: http://intronetworks.cs.luc.edu/ Most SWEs I've met don't understand networks well despite writing software that interacts with them.

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.


Thank you for the suggestion about networks. I will have to bend that a little to see if I can make it immediately useful by learning something like the HTTP spec. I have done a lot of backend web development but I do not know HTTP deeply. Also, I wish I had done a CS degree - then I would have HAD to study networks! I am largely self-taught.


> Learn how to convince the CPU, memory, disk, and network to give you all the performance they're capable of.

How and where do you learn this? Can you link some resources?


Unfortunately I don't have any -- I'm self-taught on the job. But as an example -- pick some project that involves high-bandwidth or low-latency I/O to multiple devices. Say, line-rate network packet capture to disk. Hold yourself to the standard of not dropping any packet. Try first 100 Mbps capture, then 1 Gbps, then 10 Gbps. Try first capture to SSD, then to HDD (higher latency). Progressively restrain the number of CPU cores and amount of memory you allow yourself to use -- try to get down to 2 or even 1 core, and under a GiB of memory. Add a requirement to minimize the latency to disk -- 1 second, 100 ms, 10 ms, 1 ms. Spec the problem to push disk and/or memory bandwidth requirements to their limits for your system -- if your code can't perform at the level the hardware should allow it to -- figure out why and address it.

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.)


> Learn basic statistics. Apply it to performance testing, system modeling.

Any resources for applying stats knowledge to these topics?


The main tools I use are histograms, confidence and prediction intervals, and Welch's t-test. You should be able to find these in any statistics textbook, or Wikipedia if you're adventurous.


Here are a few project ideas: get into compilers/interpreters (write a lisp AST interpreter, then a bytecode VM, then a compiler to C, then a compiler to LLVM, then write a JavaScript implementation, etc.), GUI programming (try out Electron, then Swift and Kotlin), hack on databases (build an in-memory key-value store, then one on disk, then one backed by a Raft implementation, then an in-memory SQL database), write an operating system, write a web browser, write a software renderer (i.e. skip the GPU and draw triangles directly), build a game, implement Docker in bash, write a code editor component for JavaScript with syntax highlighting and autocomplete and CJK support, get into networking (implement an HTTP server from sockets, implement TCP/IP), write a native text editor, write a standard library for some language (including common containers, networking libraries, etc.), emulate x86 then original game boy or some other simple game hardware, build your own computer with nand2tetris or the digital design and computer architecture book with whatever the modern version of Logisim 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.


If you like databases, you can start exploring the internals and write one! There is no going back once you dig deep into the storage internals, KV stores, and distributed systems.

plug: I made an educational project which can help you write a database in python, from scratch - https://github.com/avinassh/py-caskdb


This looks very interesting. Thanks!


> I mainly use Python and SQL

Learning how to write fast (as in performance) software. So optimizing memory usage, parallel (SIMD/GPU) computing and microarchitecture optimizations.


And learn how to optimize your queries and index data!


if you haven't used rust, its definitly going to be new territory for you. The borrow checker doesn't exist in any other language and its an incredibly bovel abstraction for proving an absence of race conditions or memory leaks.

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


It doesn’t feel like a vague request so much as one whose answer is very personal.

You 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.


Thanks for the valuable insight! Glad that you could find a rewarding project! Hoping to find something like that myself, at least temporarily, before I look for the next thing :)


Marketing. Think how often you read developers who scoff at marketing, right up to the point they try and launch a product and it struggles to gain traction. Marketing seems sleazy, cheap or simple, when in fact it's none of those things. Value creation is in huge part marketing, because if your users either don't know or don't care about the product, it isn't creating value...

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.


Have you ever dabbled with Elixir or Erlang? If not, consider giving it a try. My old boss switched a project we were on from Python to Elixir because the abstractions in Elixir for recovering from a failure, text processing, message passing, and so on felt cleaner.


Nothing. Don't learn anything. You'll waste time learning something you'll probably never use or forget what you learnt if you ever need to use it. You are a software developer; you can learn anything when you need to. Save it for then. For now, enjoy your time.

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


Hmm, is this a dig on Python? If so, sorry to hear that. My experience has been the complete opposite. Python in inherently intuitive to my way of thinking. And I have seen lots of Python applications where deployment, dependency management has not been a major problem (at least not worse than other languages). I see elegance in a lot of the Python code I read and its performance is good enough for the applications its used in (otherwise, it wouldn't be a good candidate).

Just mentioning that for every one of you, there probably is one of me :)


I've been working on documentation a lot. Nobody seems to want to do it, yet everyone seems to want more.

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.


Thanks for this wonderful suggestion! I would love to know your thoughts about techniques for enabling a "documentation-centric" culture as well as how to write good documentation. I have realized over the years that it is definitely something that makes or breaks functioning teams. When people want to transition from one team to the other to break some monotony in their work, its great to have documentation that helps a new person onboard. Solves a lot of issues!


Assembler. The closer you get to the metal, the more interesting it is. Be the bits!

Here's a good start:

https://www.nand2tetris.org


Thanks for this suggestion, I have seen this before and its not really my area of interest. I do want to read Petzold's "Code" though. I hear a second edition is out!


Hello OP here.

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! :)


You haven't even used a statically typed language yet. Saying you will be able to learn Rust in a weekend is ridiculous. There will be so many new concepts for you.


I would go further and say every time I try to learn a new language, I discover multiple things that I believed to be absolute truths are, in fact, actually lies.

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.


Yeah and even after Rust there's still a whole world of even more advanced/difficult techniques like pure functional programming, formal verification, proof assistants... and even totally different paradigms like HDLs.

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!


Sorry I did not word my question properly regarding my experience. I clarified in a later comment. I have worked on multiple languages like C#, Java, Clojure and have deployed code to production in all of them. Python is just my language of choice to reach for to solve a problem. I have no misgivings that it could be used for all problems.

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.


Just wanted to point out that "content with programming ability" to me is not the same as "I am done learning". I just feel that the competency I have in turning a problem into code is good enough for the time being, and it would serve me better to increase my skills in other areas for now. Software engineering after all, is much more than programming.


Maybe go beyond programming and think of methods in data analysis, machine learning, and decision making.


To second this: explore tangents to your core knowledge - electrical engineering, mathematics, logic and human systems (eg governance structures, group decision making etc). These all likely intersect with what you do and are each fascinating domains on their own.


I can't offer any advice, Captain, besides perhaps suggesting you play a bit with machine learning and see if it catches your interest.

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?


Sure! Sorry I need clarify - my logic programming experience has nothing to do with Python. It was one of those times when I was looking to learn something different and so chanced upon Prolog. I did tutorials in SWI-Prolog and was fascinated by it - I did not have any idea that a language like this existed! The fact I know now that something like this exists and is very effective at a class of problems is sufficient for me! I also dabbled with Google's Logica over a weekend to get familiar with it.

Sorry if this wasnt what you were looking for :)


The fundamental problem of large-scale software development is that brain-to-brain transfer of information is hard. So, work on interpersonal communication.


> Python and SQL and feel like I can use it to solve mostly all problems

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).


Woodworking, of course. Very popular with programmers.


Hehe, I'm doing a lot of SQL and python and feel the same about "solve pretty much anything". Is that the golden duo?


Do we work for the same company? :) Jokes aside, I do feel they can be used for most of business problems. Compilers, etc are a different thing, maybe. But its not my area of interest.


Hehe, unfortunately python is more of a personal occupation. I wish I could use it at work too, but it's really not in our stack.


Quantum mechanics. Interdisciplinarity produces superlinear returns


learn to sell and negotiate


Learn Elixir. Enjoy!


Scala and spark ?




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: