DEV Community

Cover image for What were some of the toughest technologies and concepts for you to grasp along the way?
Ben Halpern
Ben Halpern Subscriber

Posted on

What were some of the toughest technologies and concepts for you to grasp along the way?

What were they, did you every fully overcome your confusion?

Top comments (87)

Collapse
 
ben profile image
Ben Halpern • Edited

I'll go first with a few:

  • Git: It took me a while to learn the basics, and it's still something I don't feel like an advanced user of. I tend to stick to the commands I'm most comfortable with.
  • Testing: This took a while for me to get the hang of, but I feel like it's turned into a strength. I love TDD and find great comfort in a well-written regression test. πŸ˜…
  • Typed languages: I think I got into the domains of untyped languages as a career because I had some mental blocks around types. These days I'm much more comfortable in either domain, but happen to still work mostly with Ruby, my fave lang.
Collapse
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard • Edited

As a lazy programmer, I don't fear to give the advice we are not supposed to give:

  • Learn git concepts
  • Learn a good git GUI like GitHub Desktop, IntelliJ, SublimeMerge
  • Learn a good git terminal client like GitHub CLI or lazygit
  • But don't learn the git CLI, at least not today, not this month, not this year

More details here:

Collapse
 
leob profile image
leob

Why not the git CLI ? I've hardly ever used anything else (apart from some basic git tooling in VSCode to view diffs and git history), and I've always been happy with it. Whence the advice NOT to learn it?

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard • Edited

Laziness, the reason is Laziness.

I prefer to use tools that

  • achieve the same outcome
  • require 10x less time to master
  • help you to make 10x less mistakes while you are learning

Try to read man git-log and you will understand what I mean

Thread Thread
 
leob profile image
leob

Maybe, but for me learning and using the CLI was/is the easiest way ... I've tried to use a GUI a couple of times, but pretty much disliked it.

The CLI (i.e. text based commands) also allows me to script, document and google what I do ... making it all much more repeatable and "discoverable" than when I have to click around in a GUI. Anyway I've always loved and preferred the command line :)

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard

Lazygit is not a gui, it works in the terminal, give it a try

GitHub logo jesseduffield / lazygit

simple terminal UI for git commands

CI Go Report Card GolangCI GoDoc GitHub Releases GitHub tag homebrew

A simple terminal UI for git commands, written in Go with the gocui library.

Gif

Sponsors

Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. πŸ’™

Elevator Pitch

Rant time: You've heard it before, git is powerful, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? Are you kidding me? To stage part of a file you need to use a command line program to step through each hunk and if a hunk can't be split down any further but contains code you don't want to stage, you have to edit an arcane patch file by hand? Are you KIDDING me?! Sometimes you get asked to stash…




Thread Thread
 
leob profile image
leob

Ah I misunderstood that ... okay, added this to my ever-growing list of "things I should check out" - but in all likelihood I probably won't, and I'll stick to my current workflow instead, as I'm used to it and it seems adequate to me - and since I'm, well, a bit too "lazy" ;) to adopt an "entirely new way" ... tradeoffs, always tradeoffs.

(I do acknowledge that, once I've learned it, I MIGHT become marginally more productive - but I'm probably better off eliminating a few far worse sources of unproductivity among my current working habits)

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard • Edited

My question then would be: how much time did it really took you to learn to do git without bad mistakes all usually during many years?

For me I realized it was much much more that I would have needed to learn lazygit once I understood the git concepts.

That's why I tell people that they should feel free to not learn the details of git if they have better things to do with their life. Like I learned all vim commands when I was young and it was fun but no one should feel obligated to do the same.

Thread Thread
 
leob profile image
leob

"How much time did it really took you to learn to do git without bad mistakes all over the years?"

The honest answer is, not much ... I'm absolutely not saying I'm more clever than the average dev, but maybe I'm more pragmatic. I learned the basics and that was pretty simple, and the number of errors or screw-ups has been tiny over the years.

Note that I've always steered clear of "advanced" stuff like git rebase, when a "merge" does the job as well, I just keep it simple and it works for me. Less than a dozen commands that I'm using on a daily basis (I tend to define bash aliases for most of them), and on the rare occasion when it gets hairy I google it.

Not feeling like I've ever missed anything, git is simple and logical, a breath of fresh air and a huge relief when you've had to work with stuff like CVS or Subversion (or, the lord forbid, MS SourceSafe).

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard

Then if isn't broken don't fix it.

Thread Thread
 
leob profile image
leob

That's what I mean :)

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard • Edited

Yes, and what I mean is that I think it's broken* for many more developers than you probably think.

(*) meaning here that it technically works but it requires way much efforts than necessary

Thread Thread
 
leob profile image
leob

I can't really comment on that in a knowledgeable and objective way, but the ones I know and have worked with don't really seem to have the problem, AFAIK ... could be wrong tho :)

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard

The easiest way to know is to look at how much traffic super basic git questions that shouldn't be an issue get on stackoverflow. That's the equivalent of a code smell but for a product

stackoverflow.com/questions/tagged...

Thread Thread
 
leob profile image
leob • Edited

Look, what I know has been criticized a lot is that some of the commands aren't intuitive - I mean, when I want to discard my local changes, why on earth do I need to type git reset HEAD . ?

But personally that has never bothered me, it was part of the learning curve, and not even the most complex part by far. In some cases I've even tucked it away behind a bash alias.

I wanna discard my local changes? I press Control-R in my bash shell and type "reset" and bada bing bada boom there's my git reset HEAD . and I press ENTER, done.

Does-not-bother-me-at-all.

Oh and more recent versions of the git client have rationalized a few commands by introducing more logically named new variants.

The thing I appreciate about git is the sheer genius of how it's designed and how it works, the commands are just that, it's never bothered me.

Personally I'm just the type of guy who wants to work with "the thing" itself - 'bare metal' if you like. I don't want wrappers or GUIs or whatever stuff needs to be put on top of it, and being dependent on that.

Thread Thread
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard

I should do an article about this.

Collapse
 
fetchworkglenn profile image
Glenn

Do you have any suggestions for how to learn TDD? I can't seem to grasp it.

Collapse
 
johndkane profile image
John Kane • Edited

When I get lost in my programming of a library, for example, because there are so many ways to implement its features and so many plans for features, I then start to ask myself: how I can simplify things or get something useful implemented more quickly? Then I act like the user of the library by writing unit tests about how I want to interact with it to access its features, before they are done. This in turn forces me to tie down the library by programming it to match the desired usage, and reduces frustration by fast-tracking a workable solution in a pragmatic manner. It's specing out the solution in parallel with implementing it, instead of having it speced out fully beforehand and following up with implementation only afterwards.

TDD for the sake of itself isn't necessarily useful, until you find a reason that it helps you in your line of programming. Not all lines of development need TDD like user interfaces that are more driven by design specs and implemented using an event system, as one example.

Collapse
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard

The most awesome way to learn TDD is to do a pair-programming/mob-programming session where you strictly divide the responsabilities

  • one says what should be done
  • the other takes care of implementing it

I should add that I think that TDD should be one strategy that you have in your toolbox and not a dogma.

Collapse
 
leob profile image
leob

I think testing/TDD is one of the topics people struggle with the most ... not to understand the theory, but to practice what "we" preach, and to stick with it ... it's THE first thing people (including myself) tend to drop, or get sloppy with, when push comes to shove.

Collapse
 
davelapchuk profile image
Dave Lapchuk

Lol I'm the opposite. Untyped languages drive me nuts.

Collapse
 
dinerdas profile image
Diner Das

I feel the same way about git

Collapse
 
codingjlu profile image
codingjlu

I started my programming with Java, so typing wasn't a problem 🀣

Collapse
 
canolcer profile image
Can Olcer

Same with testing. Used to hate it, now can't sleep well at night if I deploy untested code. Also, the green check marks have something oddly satisfying. Have you ever used RBS or Sorbet with Ruby?

Collapse
 
jinacker profile image
jinacker

Thank for your writing. Wonderful

Collapse
 
sotenna profile image
Sotenna Max

Javascript. . .still javascript. What I'd give to understand it!

Collapse
 
codingjlu profile image
codingjlu

I mean, JavaScript is just lots of concepts. What are you having trouble understanding?

Collapse
 
droidmakk profile image
Afroze Kabeer Khan. M

I believe to test out a concepts, we do clone a repo and test it out if it worksout push it or bail out. Critical scenarios is when you do force push on remote branch and working with remote repo.

Collapse
 
lucaswinkler profile image
Lucas Winkler

I used to always hate CSS. I just couldn't understand any of it. I said I want nothing to do with it and stayed learning backend development with C# and ASP.NET. Fast forward a couple years and now I'm labeling myself as a Front-End Developer. Ive always loved making things look good but css just didn't click with me for a while. Not sure what changed but suddenly I understand a good amount of it. Still haven't touched grid but hey flex is working just fine so far.

Collapse
 
crowdozer profile image
crowdozer

I also hated css early on. I couldn't make anything look good, I didn't know what half of the properties did or what their values were. Over time (largely thanks to type-hinting) I slowly started memorizing what does what, what goes where, etc.

I think I just didn't like it because of the learning curve. As someone who just wanted something to work, overcoming that curve was always a secondary goal, therefor CSS was more of an obstacle than a curiosity. It feels really natural to me now. I wouldn't say I love it but I don't hate it anymore. πŸ˜„

Collapse
 
leob profile image
leob

Good one ... yes, CSS is friggin' hard especially layout.

Collapse
 
jd2r profile image
DR • Edited

It's funny, but it took me the longest time to grasp the concept of a function parameter. I didn't understand what they were or how they altered what the function would output.

I finally got it when I found this simple example in JS that illustrated it well.

function feetToInches(feet) {
   return feet * 12;
}
Enter fullscreen mode Exit fullscreen mode

I feel so dumb now, but I guess it kind of illustrates how far I've come! πŸ˜ƒ

Collapse
 
zimaben profile image
Benny T • Edited

if the function was inches to feet wouldn't it divide by 12?
EDIT:(not that it really matters and not trying to be that guy, just tripped me up.)

Collapse
 
jd2r profile image
DR

Thanks, nice catch! Changed it :)

Collapse
 
deciduously profile image
Ben Lovy

I still find async tricky. I was puttering along fine using Rust's flavor of it until I needed to use tokio::select! - even though I understand it now and can use it effectively in solutions, the code is just not intuitive for me. It takes me a while to think through, and often some napkin-scribbling.

Collapse
 
droidmakk profile image
Afroze Kabeer Khan. M

try generators more fun πŸ˜‰

Collapse
 
frikishaan profile image
Ishaan Sheikh

Docker

Collapse
 
ben profile image
Ben Halpern

Oh, good one!

Have you come around on it yet?

Collapse
 
frikishaan profile image
Ishaan Sheikh • Edited

Not yet, but trying. Let me know any resources that can help.

Collapse
 
amitk1990 profile image
Amit

For me its Regex, I still don't get it right.

Collapse
 
jmfayard profile image
Jean-Michel πŸ•΅πŸ»β€β™‚οΈ Fayard • Edited

I will say testing things properly is the biggest one.
And also probably the biggest step from programmeur amateur to becoming a professional.
I haven't figured out testing fully to be honest, but I'm definitely better than I used to be.

Collapse
 
codingjlu profile image
codingjlu

Ugh, I was really dumb back then. In my first month as a programmer:

  • What the world does return mean?? What is it supposed to do?
  • Why do I have to create a class just to access a method (I started out with Java)? Does OOP stand for obscene obscure programming?
    • What's OOP and why use it??

After a while in web dev, I had a hard time understanding:

  • Why every time I access the DOM it just says [object Object]? lol
  • CSS:
    • It's really frustrating because I didn't know how properties work with each other, and thus the CSS "didn't do anything"

Later as a fullstack dev:

  • NodeJS was confusing to learn

Later learning JS frameworks:

  • Cannot use import outside a module ... invalid module path
    • What in the world is webpack? Why use babel?

After learning about security and authentication:

  • How in the world do I keep hackers out??

Learning Rust:

  • Ownership is sooooo annoying and confusing

In my career now as a ML dev:

  • What's a neural network?
  • How does ML even work??

I'm glad to be over all that now, although I'm sure something new will come up sooner or later. I guess it makes me understand those people on SO who have literally no idea what they're doing, because many years ago I was one of them.

Collapse
 
giulio profile image
Giulio "Joshi"

I'd say SOAP.

I was merely an 'user' for long, until I had to debug a patched version ot a custom library... well after that I made a mental folder of things you learn to avoid doing the same mistake in the future.

Collapse
 
crowdozer profile image
crowdozer

Starting out, the concept of "frameworks" and "libraries" confused me a lot. Not just the distinction between the two, but how they actually work, and the patterns they guide you into. For example, when I first heard about them, Jquery and Angular looked completely foreign to vanilla JS. They might as well have been separate languages to me.

Regex was a complete mystery to me for years. It still sort of is, but I can at least parse it mentally and create some basic ones. I still have to use regexr.com/ to test them though, lol

Linux was pretty tricky to learn. I was pretty much obligated to learn it because I was managing a php server. Docker actually made this process a lot easier. It's not the shell that gave me trouble, rather it was the nagging feeling that I wasn't fully understanding something, not getting the bigger picture. All those weird folders, config files, etc...

Learning React, Redux, JSS, etc for the first time was pretty rough. There were a lot of new paradigms thrown at me all at once. Took me a few months but I got comfortable eventually.

Docker and Kubernetes gave me a lot of trouble too. Docker was the easier of the two to grasp, but trying to combine them and get my own cluster set up was a lot of work. I bet the learning material and guides are a lot better these days. Kubernetes in particular was rough, because there were times where I didn't even know what to google. "If you know what you're looking for, inquiry is unneccesary. But if you don't know, how do you inqire?" πŸ˜›

A couple of things that are still giving me trouble: Microservices and event sourcing. Sort of in the same boat with those!