Ask HN: Learning proper software engineering practices as a student / researcher

14 points by testtesting123 ↗ HN
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 ] thread
(comment deleted)
One of the many skills you need to learn is to be able to repurpose your code to do new tasks. The Advent of Code is a set of programming puzzles in 2 parts that happen December 1-25. The challenges ramp up in difficulty.

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

AoC is amazing, but I don't think it's a good fit for what the OP needs. The solutions tend to be algorithmically hard, but for the most part quite short, and don't really require SW Engineering chops (as opposed to "programming" chops).

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.

Yea, I have learned some important practices while programming projects but I feel as though my coding is rather messy.

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.

I spent some 16 years in academia, so I understand your context... It's very easy to fall in the "quick hack" trap, and end up with a terrible mess.

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.

there's no one right answer because to some extent it's subjective.

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

I heard (from a research professor!) that the best way to learn real-world large-scale design patterns is to work in industry. Because at a big company, you are working on a real-world large-scale system. So I would recommend, if you have the opportunity, try getting an internship before grad school.

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.

Even if you can't get an internship you can still learn from real world projects from big companies (or solo devs!) by checking their open source projects.

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.

As an army guy that deploys a lot what has helped me is portability, slim code with minimal dependencies that can be easily repurposed. Don’t make any promises or assumptions about your network connectivity or executing environment.
Read Code Complete and Clean Architecture, then start incorporating those tactics and concepts into your own projects.