Ask HN: Learning proper software engineering practices as a student / researcher
Hi HN,
During my undergrad, I spent time working with programming tasks mainly related to research and I often felt like a lot of it was super messy due to fast research deadlines and most/all others working on the project not worry about the coding.
Before I start to do my research as a grad. student, I would like to learn how to construct applications with proper structure. I have looked around the internet and either examples are too simple and contrived or are complex open source projects which make it hard to understand why they do things a specfic way. I have never had to time or intership to work and discuss large projects and how they engineer certain things. I feel like I have learnt a lot of concepts in school in a sandbox and I'm ignoring so many concepts I learned about design patterns and software.
10 comments
[ 3.0 ms ] story [ 36.5 ms ] threadThe first part is usually something that you can solve with the most obvious algorithm... the second part requires a far more optimum solution. These exercises are fun, challenging, and online, you can do them any time.
https://adventofcode.com/
Also note that these are great for trying out that new programming language you wanted to learn.
Working on a real, larger-scale code base, in a context where good SWEng practices are required is probably a better learning path. An internship, as suggested by Jakobeha above is probably the best way.
If an internship is not feasible, and existing projects seem too daunting, it might be easier to start one (or rather several) of your own. As with most things, practicing helps.
It's not as though I haven't programmed at all since I build out and maintain expriments for research. It's just that I feel that I am just programming to get things done and have no clear structure to my code.
On the other hand, much of the code you do while doing research is truly throw-away stuff. What I found helped me (especially when coming back to my code later on), was to use literate programming (in org-mode) to record my thought process along with the (often polyglot) code.
it's also like asking for advice on how to write a book, whilst having never read a book.
read lots of code, write lots of code, listen a lot, and form your own path
Of course not all companies have the best practices, but in my experience most do. If you decide to find an internship, ask about design patterns / code reviews in your interviews.
Alternatively, you could read up on good design patterns and practice. I've heard people recommend Uncle Bob's "Clean Code" and "How to Design Programs". Also see https://news.ycombinator.com/item?id=25299547.
You won't have a mentor but you can still learn something.
What I suggest is to start with projects you are already familiar with. For example, I work with machine learning and python. I've been learning a lot by studying the code from pytorch, fastapi and other libraries used in this field.
Another great way to learn is to implement new features for projects you use. You can start by replicating existing ones. For example, you can find a PR that added a new feature, then try yourself implementing it and use the actual PR as a guide when you get stuck.