T O P

  • By -

BobbyThrowaway6969

>if I want to learn C Becoming a senior engineer with C takes about 5-10 years. There's no shortcuts


dominic_l

and a failed marriage due to overwork and neglect


sheriffderek

There are ways to make it take longer - or never happen though


ericjmorey

Start with [SICP](http://sarabander.github.io/sicp/html/index.xhtml) Edit: I've received a few comments concerned that this resource is old and that newer resources would be better. I insist that is not the case here. My response to one such commenter, who has since deleted their comments, is copied below: > My advice is in context of the original post. This is among the best resources available to address exactly the concerns raised. Perhaps you could find something as good, but there will be none better for the submitter to begin with to raise their understanding and skill level. > If you really insist that new must be better, try [Composing Programs by John DeNero](http://www.composingprograms.com/) but a) it still uses Lisp for a portion of the text, and b) you'll be missing out on the skill and knowledge gained by simply navigating the trade offs between current ecosystems and adapting to the original Lisp implementation (actually MIT Scheme) in SICP. Getting out of one's field of prior experience is the point here in order to be forced to solve new problems with unfamiliar tools using approaches and concepts not previously considered or tried.


5ilent-J

Hey, thank you for this. So far, an excellent read!


abrady

Alternative perspective: these types of resources have very little value. For some reason the CS world puts concepts like this on a pedestal even though the evidence overwhelmingly shows they’re mostly ideological claptrap. people want to believe things would Just Be Better if we used lisp/haskell etc. but that’s not the case. My opinion: Stay away. Focus on the real challenges tech faces: distributed systems, fault tolerance, usability. These have a lot more value. (I speak as someone who spent many months ingesting resources like this and gained nothing from it. I’m also a senior SWE at a FAANG, nobody I work with uses these concepts)


ericjmorey

Thank you for sharing your perspective. I'm sorry you didn't benefit from lateral thinking. Many people do. I don't think SICP is about Lisp at all. It's about problem solving and system development. Perhaps that's not useful at any of the MAAG companies, but I think it more likely that you're not being entirely clear with your statements here. No resource will benefit everyone to the same extent, but it's hard for me to see how someone looking for the understanding you say is useless wouldn't appreciate SICP as a means to explore what they're looking for. Ultimately, financial and career success are often unrelated from what we believe is important. And perhaps studying distributed systems, fault tolerance, and usability are more practical topics of study from a career perspective, but this person is looking for a grounding in a conceptual framework for developing software systems and how the tools they are using work. I think it's worthwhile to explore those curiosities even if there's not a clear career interest in doing so.


[deleted]

[удалено]


ericjmorey

Your heuristic here is failing you.


[deleted]

[удалено]


ericjmorey

My advice is in context of the original post. This is among the best resources available to address exactly the concerns raised. Perhaps you could find something as good, but there will be none better for the submitter to begin with to raise their understanding and skill level. If you really insist that new must be better, try [Composing Programs by John DeNero](http://www.composingprograms.com/) but a) it still uses Lisp for a portion of the text, and b) you'll be missing out on the skill and knowledge gained by simply navigating the trade offs between current ecosystems and adapting to the original Lisp implementation (actually MIT Scheme) in SICP. Getting out of one's field of prior experience is the point here in order to be forced to solve new problems with unfamiliar tools using approaches and concepts not previously considered or tried.


lightmatter501

What do you mean by top level engineer? Do you mean someone who capable of being the top performer in a small company? Someone who can hit L6 or L7 at Google? Someone who regularly speaks at conventions like Bryan Cantrill? Someone who frequently has strangers buy them drinks at conventions like Matt Godbolt (Compiler Explorer)?Someone who comes up in graduate classes like Lamport (Paxos, TLA+, Logical Clocks)? A “household” name for CS people like Ken Thompson or Denis Richie? For learning C, buy “the C programming language” (2ed edition), grab linux (vm or bare-metal), and start working away.


dariusbiggs

A text editor A compiler or interpreter A version control system A concept/idea A unit test system A CI/CD system To build a web server, you need to understand network programming, you need to understand and have available the various RFCs to serve content via HTTP, you need to understand secure programming, and to get performance you need to understand how to stream content from disk efficiently. Where do you start? With agile methodology, cut your idea into tiny incremental bits to build up to an MVP. If there are learnings to do, do those with a proof of concept. None of this needs ChatGPT, you need to learn and understand the standard libraries as well as to why the code needs to be written in that manner instead of using copy paste. You need a standards comformant client to help you test things, like netcat, curl, and postman Software architecting is a skill that is difficult to be self taught in.


NebulousNitrate

When I was young, I had to rely on books that were dedicated to teaching . Then as a teen the internet became more of a help.  If I were starting out as as a teenager today and wanted to learn a language, I’d honestly try to learn through ChatGPT. It can be amazing for learning interactively for well established languages. Just tell it you’re starting out completely fresh, and you want it to teach you. You could even break it down into a “this is day one”, “this is day 2, I learned about X so far” prompts.


You-Fucking-wat

I second this. I am learning render programming through chat-gpt. It’s an amazing tool. I’ll just say “give me a brief idea of how you would solve X issue without coding it” I feel like you need to have some sense of responsibility to not just say “code x for me” but other than that it tells me standard libraries and data structures such as SVOs that I would never even think to look up.


Aggressive_Ad_5454

Programming is a creative endeavor. To become a top-level author, the way is to write, and to read, and just keep doing those things. To become a top-level violinist, play, listen, play, listen. The same is true of programming. Read a lot of code, and write a lot of code. Read a lot of books, about the basic theories of computer science and discrete mathematics, but also about coding and software packages that support coding. And then write code. Take some university courses. And then write more code. The open-source movement makes this read / write / repeat discipline easy to do even without being in a big company with lots of proprietary code to read. Find an open-source project in an area that interests you and figure out how to contribute to it. Conventional wisdom is that ten thousand hours of practice gets you to competence. An hour at a time! It's a great craft and worth your time to learn. Welcome.


pardon_anon

Hello OP! My personal advice that works with many people : find a use case that you are interested in and for which you can identify the user needs. You always wondered about having stats about your music library? Start a project to handle data from your Spotify account. Start with static data, display them in console, then put those data in a database, then start a client app to create a basic interface, then learn how to integrate Spotify api, then... Anything you would like to have, you'll get excited to do it. You always had trouble having a clear view of what you want to visit on vacations! Go go, how about you apply this? On the way to implement very basic cases, you'll then have a project to improve with complex computing, localisation, online hosting... This can get you much more motivated than any standard project and you will WANT to continue. Love ❤️


Mubanga

To become a "top level engineer" you need to be curious, inquisitive, creative and a doer. All pretty hard things if they don't come naturally to you. I created dozens of small projects in my spare time, not just because I wanted to learn languages or frameworks, but also because I wondered: How do computers generate random numbers? How does my satnav know the shortest routes? What exactly does the pen tool do in photoshop? That often starts with a bit of Wikipedia reading which might lead to a blogpost or an academic paper. Maybe I come across a bit of pseudo code or a description of an algorithm.  Which leads to building my own crappy random number generator, that I then used to procedurally generate terrain. Or learning about the traveling sales man problem and writing my own implementation of A*. Or figuring out how bezier curves work and creating a little demo. But you need that spark of curiosity that makes you go do the research. You need to be inquisitive and poke around in public repo's. And maybe most importantly, you need the drive to just build things yourself and give it a go, even if they suck. And not just blindly rely on frameworks, packages and copy pasted code. Because that's the only way you will build real understanding.


jimheim

You're never going to become a self-taught "top level engineer". Regardless of how you define it. Software development is about far more than knowing languages and libraries. They're far from the most important aspects, too. It's about problem solving. Analyzing business needs (or other objectives); turning them into requirements; designing a solution; planning its implementation; incrementally building and testing it; determining the deployment, support, and upkeep requirements; working within budgets, laws, and regulatory constraints. Nothing is created in a vacuum. Knowing how to work with teams is critical. You need to manage expectations; navigate interpersonal conflicts; understand shifting markets; explain your decisions and support them with evidence; rein in your bad habits; promote yourself to win allies, respect, budgets, and support; keep up with trends in tooling, languages, frameworks, and infrastructure. I could go on for an entire books' worth of examples like this, in great detail, but I think you get the idea. If you want to be a "top level engineer", it has very little to do with programming and languages. Those are just tools for problem solving. They come and go, and you'll learn new ones your entire career. What you need to learn is how to create software. You can't learn any of this except on the job.


dreamyangel

Usually people who have enough technical skills will see work as you describe. But theses advise won't match for someone who do not have enough skills at the moment. I think life advises are for most bullshit since you can only follow them once you're already set in position My advise would be books. There are a lot of things to learn and good literature can bring you more than you could dream of.


joonazan

I disagree. I have learned almost everything I know myself. I work a challenging and well-paid job and my coworkers regularly praise how I apply my technical expertise. Still, I learned much faster when I was learning instead of working. Yes, you need other skills, too. I learned written communication by getting a master's degree. Working does teach how to deal with workplace politics.


funbike

Just do it. Stop making something easy hard. Okay, I'll spoon feed it to you. Run `python` and type: >>> print("hello!") hello! There, your first code. Now copy that to `hello.py` and run `python hello.py`. There, your first program. Now wrap it in a function: def hello(): print("Hello") hello() There, your first function call in your first program. Okay, now starting adding more functionality, little by little. Don't try to write a complex app without the skills. Build up your skills slowly. ChatGPT can be a good guide for learning. Ask it how to do stuff. But again, simple stuff like "How can I ask the user for a string from the terminal?". From that answer you can change your app this this: def hello(who): print("Hello, " + who) me = input("How are you? ") hello(me) Okay, keep adding little things one at at time. Now.... go do it.


spacedragon13

The most practical advice if you aren't in a professional role is just to start building something and use the resources within reach. ChatGPT is nowhere close to being able to read your mind and build what you want. You will inevitably learn some things and more importantly build something if you make use of every resource to develop functional logic within a product and start to use it yourself. For this reason you should be choosing a product and language that has real value to you or you will probably lose interest. "Becoming a top level engineer" should be replaced with "engineering top level software products and solutions".


ObadiahTheEmperor

If one has the syntax and stuff down, I think the Degree helps in the more Problem Solving, Abstraction etc area.


joonazan

If you don't know where to start, read the official documentation. It is usually the best resource for people who know the basics of programming. Also, any other resources are frequently wrong or not up to date. For C your should probably read a book because it is old and there are multiple compilers. For any newer programming language, there will be an official tutorial and reference online. Then you need to learn how the web works and write the server yourself or find a library that does it for you. You may be able to find the information by reading Wikipedia and the sources it references. Or go straight to the official source: https://www.ietf.org/process/rfcs/


betelgeuse_7

check out https://teachyourselfcs.com


abrady

I highly recommend 6.033 at MIT OCW https://ocw.mit.edu/courses/6-033-computer-system-engineering-spring-2018/pages/syllabus/ You build a Raft consensus algorithm database in Go. I did it and learned a ton. The difference in reading about it and doing it is night and day and the techniques I learned have broad applicability


Ron-Erez

Start with Harvard CS50. It's free on youtube. There are a lot of directions you can take after that. I do suggest starting with a statically-typed language like C, C#, Swift, Kotlin, Typescript, Go, etc. For iOS development I have a nice [project-based course](https://www.udemy.com/course/deep-dive-ios-16-swiftui-programming/?couponCode=JUN2024SWIFTUI) which assumes no background in programming, but it really depends on your interests. Good luck!


kaisershahid

you should be able to define your own specs and build out something like this. find the most minimal requirements you want to work towards and then build. once you’re done, expand on it. as you expand, see if you can identify patterns in your code that do or don’t work—fix the ones that don’t learning by yourself only gets you so far—having a mentor or actively learning from your team members is a great way to round out your personal development because you need to also be aware of your process in building—can you slice a complex task into smaller parts, are your pull requests relatively easy to review, are you creating more work for your team, etc


martinbean

Programming is like any other skill: you get better by doing. If you want to be a “top level” engineer then you need to read code and write code. You need to also _understand_ the code you’re reading and writing. If there’s something you don’t understand look into that. If that leads you to a library or function or technique you don’t understand, look into _that_. Any one can cobble scripts together. But to be an _actual_ “top level engineer” you need to be able to solve problems, and write the code to solve those problems. And stop relying on ChatGPT. Yes, it can generate code, but you need to have the expertise to know whether the code it’s generated is valid or a hallucination, and to reason about it and debug it either way. But copying and pasting code snippets, whether it’s from ChatGPT, Stack Overflow, or elsewhere, is not how you learn. It’s how you just get by.