this post was submitted on 01 Sep 2023
337 points (96.2% liked)

Programming

17308 readers
191 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 73 points 1 year ago* (last edited 1 year ago) (5 children)

Not sure if these are hot takes:

  • Difficult to test == poorly designed
  • Code review is overrated and often poorly executed, most things should be checked automatically (review should still be done though)
  • Which programming language doesn't matter (within reason), while amount of programming languages matters a lot
[–] [email protected] 33 points 1 year ago (2 children)

I agree with your first point, but pretty strongly disagree with the other two. Code review is critical. Devs should be discussing changes and design choices. One Dev can not be all things all the time and other people have experience you do not or can remind you of things you forgot. Programming language absolutely matters when you’re not the only dev on the team.

[–] [email protected] 26 points 1 year ago (1 children)

If code reviews in your org are glorified "styleguide checks", then they are not really code reviews at all.

Also, if you're only getting design input at code review time, that's WWAAYY too late in the process.

Code reviews should be:

  • Establishing that the code has proper test coverage (functional correctness VIA coverage, not code observation)

  • Establishing that it doesn't have unintended consequences in the ** implementation** (making db calls in a loop, exposing secure information, etc)

  • That the implementation is of the high-level design that was already established and agreed upon by the larger development unit.

  • A opportunity to ask questions to learn from whoever wrote the code

  • An opportunity for the reviewers to teach techniques that could have helped in the code

[–] [email protected] 25 points 1 year ago

You missed one:

  • To let others at least have some insight into what you're doing so you can take a freakin' vacation every once in a while
[–] [email protected] 4 points 1 year ago

Nice, so they are hot takes :D

If the design of a code change is bad, noticing that in the PR stage is not desirable. It should be discussed before someone actually went ahead and implemented it. It can also happen if people misunderstand the architecture, but again, that should be cleared up before actually implementing a change. Code style should be enforced automatically, as should test coverage and performance. Code review is also pretty bad at finding bugs from my experience. That imo leaves very few things where code review is useful that are not nitpicking.

As for programming languages, the amount does matter for individuals and for teams/organisations. A developer who can only use a single language is not very good, and using a many different languages within the same team is not good either.

[–] [email protected] 8 points 1 year ago (1 children)

Code review is overrated and often poorly executed, most things should be checked automatically (review should still be done though)

I think part of this is caused by the fact that a lot of people are bad at code reviews so they focus on things that a linter could have told you. Being able to read code isn't necessarily the same skill as being able to write it -- as evidenced by the knee jerk reaction to throw out any coffee we didn't write ourselves.

I still create code reviews when I'm working on a project alone because it gives me a different perspective on the changes I've made.

[–] [email protected] 1 points 1 year ago

It’s not that most people are bad at it, they are just out of context.

Like, I am completely swamped with a completely different business area of the code, besides checking for obviously dumb things, what can I really tell about a diff to a very separate part of the code which I may have never worked on before, with business requirements I don’t understand as I was not part of the 10 meetings that happened between the dev of the given ticket and BAs?

[–] [email protected] 3 points 1 year ago (1 children)

Difficult to test == poorly designed

It's pretty much a natural law that GUIs are hard to thoroughly test.

[–] [email protected] 2 points 1 year ago

But does it have to be? I haven't touched non-web GUIs since 15 years, so my perspective on this is limited. And web frontend is not what I would call a well designed system for it's current purpose.

[–] [email protected] 3 points 1 year ago

Imo reviews are more for checking that someone didn't drop malware into the code base. It's rare that I get a good review that goes beyond checking for malice.

[–] [email protected] 2 points 1 year ago (1 children)

I've been wanting to make my applications easier to test. The issue is, I don't know what to test. Often my issues are so trivial I notice them immediately.

What are some examples of common things in, let's say a web server, that could be unit tested?

[–] [email protected] 1 points 1 year ago

Good questions, I could probably write a lot, but I'll try to keep it short. I usually apply TDD and there are different schools of thought within it about how to structure the development process. But no matter how exactly you do it, if you focus on writing the tests while writing your code, you won't end up with an application that you then have to figure out how to test.

what to test

Well, what is the application supposed do? That is what you test, the behaviour of the application.

So in a codebase without any tests, the first thing you should write a test for is the happy path. That will probably not be a unit test. So for the web server example, set it up in a test with a file, start it and check if it serves that file.

Then you can add tests for all the error cases and for additional functionality. You can write unit tests for individual components. The ideal places to test are interfaces with clear boundaries. Ideally you should not have to look at the code of a method to be able to write a test for it. In reality that's not always so easy, especially in existing code bases, but if you have to set up more than one mock, it tends to lead to brittle tests.

Every time you encounter a bug/issue, reproduce it in a test first. And do measure code coverage, but don't make it a target, just check for places that are lacking.