codecrafters-io / build-your-own-x

Master programming by recreating your favorite technologies from scratch.
https://codecrafters.io
303.29k stars 28.44k forks source link

What are the difficulty levels of each of these tutorials? What should I know before trying any of these? #739

Open HowDoIMakeStuff opened 2 years ago

HowDoIMakeStuff commented 2 years ago

Hope this is the right place to post this.

I'm an absolute beginner, see. I'd like to start out with Python because that one will let me make the most stuff in this repository, and I have a little experience with it using Instaloader.

But for one, how well should I know Python before trying this stuff? For two, I had a look at A Simple Web Server for Python under "Build your own Web Server." But then it starts talking about the Transmission Control Protocol, which I know almost nothing about. So if I want to make my own web server in Python, how advanced should my knowledge be? What should I know?

This question applies to every one of these tutorials. If I take a college course on Python, am I really ready to jump into every one of these Python tutorials? Or is there a progression to these things? Where should I start before getting to these?

MuhammedZakir commented 2 years ago

If you know the basics of that programming language, you are good to go. Some tutorials I have read mentions if knowledge of any advanced language features are needed. So if the tutorials does not mention any, (most of the time) you can just assume basics are enough.

But then it starts talking about the Transmission Control Protocol, which I know almost nothing about. So if I want to make my own web server in Python, how advanced should my knowledge be? What should I know?

That's normal. Tutorials usually put the actual/real terms of what you're dealing with, so that if needed, you can learn more about it from other sources. If you find any unfamiliar terms, you don't need to and IMHO, should not look deep into it at the start, unless the tutorial ask you to learn it. You should only check what it means. For example, for TCP, just know that it is some kind of protocol/rule used for transferring data between applications via IP networks.

Do remember that the projects mentioned in this repo are building some stuff. So it's unavoidable to encounter unfamiliar terms if the stuff being built is unfamiliar to you. If you are doing this to learn programming language, you should pick a project that's familiar to you even if the familiarity is little. If you can't find one here, google it. If you couldn't find, then you'll just have to pick one from here.

HowDoIMakeStuff commented 2 years ago

If you know the basics of that programming language, you are good to go. Some tutorials I have read mentions if knowledge of any advanced language features are needed. So if the tutorials does not mention any, (most of the time) you can just assume basics are enough.

But then it starts talking about the Transmission Control Protocol, which I know almost nothing about. So if I want to make my own web server in Python, how advanced should my knowledge be? What should I know?

That's normal. Tutorials usually put the actual/real terms of what you're dealing with, so that if needed, you can learn more about it from other sources. If you find any unfamiliar terms, you don't need to and IMHO, should not look deep into it at the start, unless the tutorial ask you to learn it. You should only check what it means. For example, for TCP, just know that it is some kind of protocol/rule used for transferring data between applications via IP networks.

Do remember that the projects mentioned in this repo are building some stuff. So it's unavoidable to encounter unfamiliar terms if the stuff being built is unfamiliar to you. If you are doing this to learn programming language, you should pick a project that's familiar to you even if the familiarity is little. If you can't find one here, google it. If you couldn't find, then you'll just have to pick one from here.

How do I know if I know the basics? What's the criteria for that?

MuhammedZakir commented 2 years ago

How do I know if I know the basics? What's the criteria for that?

Well, that's tricky. There is no hard-rule on this. I would say:

  1. In any language: if you know about variables, functions and loop.
  2. In OOP language: if you know how to create a class, how to instantiate it, about subclass and superclass.
  3. In FP language: little more about functions: recursion, passing them around, partially applying them and currying.
  4. In a multi-paradigm language: #1 and either of #2 or #3, or both.
    • However, partially applied functions and currying may not be available in all such languages (although it is easy to implement/emulate them if you need to).
HowDoIMakeStuff commented 2 years ago

How do I know if I know the basics? What's the criteria for that?

Well, that's tricky. There is no hard-rule on this. I would say:

  1. In any language: if you know about variables, functions and loop.
  2. In OOP language: if you know how to create a class, how to instantiate it, about subclass and superclass.
  3. In FP language: little more about functions: recursion, passing them around, partially applying them and currying.
  4. In a multi-paradigm language: #1 and either of #2 or #3, or both.

    • However, partially applied functions and currying may not be available in all such languages (although it is easy to implement/emulate them if you need to).

I'm guessing "OOP" stands for "object oriented programming" and "FP" stands for "functional programming."

But I don't actually know what these terms mean. I don't know what it means for a programming language to be "object oriented," as opposed to whatever the opposite or opposites of that is/are. I don't know what an "object" is. Same for "functional programming." What is that? And then there's "procedural programming," whatever that is.

When/where should I have learned these things? Where did you guys learn these things?

bogdan-rizac commented 2 years ago

@HowDoIMakeStuff you can have a look on this PDF if you want https://bratliservice.eu/doc/PythonNotesForProfessionals.pdf but you should start reading the manual of python if this is what you want to learn. For a beginner, I don't see the point in learning how to create a webserver, unless you really want to go on that path, but even though, you should learn the basics of the language first.

Start with variables, types of variables, virtual environment in python, functions, lambdas, classes, objects, inheritance, design patterns. Create an application that will do something, a small blog, a small online shop. Just for the learning purposes.

I've seen many beginners that want to know the best things form the beginning, but it doesn't work like that. You really have to learn the basics in order to master the more cool staff.

No matter the programming language you learn, you have to start from the base level.

HowDoIMakeStuff commented 2 years ago

@HowDoIMakeStuff you can have a look on this PDF if you want https://bratliservice.eu/doc/PythonNotesForProfessionals.pdf but you should start reading the manual of python if this is what you want to learn. For a beginner, I don't see the point in learning how to create a webserver, unless you really want to go on that path, but even though, you should learn the basics of the language first.

Start with variables, types of variables, virtual environment in python, functions, lambdas, classes, objects, inheritance, design patterns. Create an application that will do something, a small blog, a small online shop. Just for the learning purposes.

I've seen many beginners that want to know the best things form the beginning, but it doesn't work like that. You really have to learn the basics in order to master the more cool staff.

No matter the programming language you learn, you have to start from the base level.

Oh, that's what I'm asking for. The base level. And the progressive levels between until I get to these Codecrafters "tests." I'm not trying to do this right now, I'm trying to find everything I need to learn beforehand so that I can do it.

And not just for Python either. I'd like to have a handle on Python, Java , JavaScript, the C languages, Ruby, Go, HTML, PHP, and CSS. Enough of a handle on these that I can jump in on a wide variety of projects people might need help on.

bogdan-rizac commented 2 years ago

There is a say

A jack of all trades is a master of none But oftentimes better than a master of none

From the list of programming languages you have posted I have the feeling that you are more inclined into know how to hack those instead of how to build something. Those programming languages are quite different in syntax and logic and is not easy to master them. HTML and CSS are markup languages, they are not programming languages. Python, PHP, Java, Javascript they have the possibility of OOP but in a different way for each of them. Ruby is similar to python with a weird syntax that I, personally don't like. Go has a totally different concept to object oriented programming, similar to RUST lang. Java, C, C++, C#, .NET are not simple at all. I know programmers with more than 10 years of experience in at least one of those langs and they don't consider themselves seniors because those are very difficult to master.

So, instead of just gathering information and not doing anything, start to actually build something and you will learn by the use cases. A good developer or a hacker is not the one that knows how to do one thing from scratch, but is the one who knows how to anticipate future changes and how to adapt the current code to what is needed.

Besides this, to know one or more programming languages is not enough (well, it used to be 10-15 years ago). Now you need to know the tools as well: IntelliJ, PhpStorm, PyCharm, RubyMine, GoLand, VisualCode, Git., and so on.

Then if you touch those you need to be aware of the environments and OS they run on. How to fix it, how not to break it, how to restart services and so on.

I am pretty sure you'll get more valuable help if you build an actual app and have question than just asking what to learn. Doing this you'll have to make the app to run, you'll have to create a building pipeline, a deployment strategy and a deployment target. You'll get into servers, load balancers, DNS, traffic rules, APIs, connections with external resources like databases, external file systems, different communication protocols and so on.

But again, it really depends on what you really desire to learn and do in the future. But don't jump into all those programming languages in the same time because you won't get too far. A ladder is climbed step by step.

HowDoIMakeStuff commented 2 years ago

I picked those other languages because they would let me do the other Codecrafters projects too. If I can know about all those languages, I should be able to do everything in the repository. That's my goal. To be able to do everything in the repository someday.

I don't intend to jump into everything all at once, I just wanna know the proper progression. What I should first learn, what I should first build, what I should do next, etc. Including the tools one would use in the development stack. And what "load balancers" are. And what "load" is. And about DNS. And the traffic rules. And what an API is. and "extrenal connections." And the various communications protocols.

EDIT: Also, I picked HTML because CSS and PHP were on the list, and if I know a language I should know the "partner" languages too, I feel.

bogdan-rizac commented 2 years ago

In my opinion, a good start to learn is to create an online shop. PHP is a very good candidate for this. But since you are at the beginning, start without a framework; codeigniter is one of the simplest, but lack of features, while symfony framework is the best in my opinion, but difficult for a beginner.

Those frameworks use the MVC (Model View Controller) concept and would be good to understand it.

You can start as well by following a tutorial I wrote for symfony 3.4 a while ago that will go into more use cases. If you follow the tutorial and have issues, feel free to contact me and I'll help you.

Now, getting back to an online shop. What you will cover during this path will be:

There are a lot more things to learn on this.

If you want only to master codecrafters, then this might not help too much, I haven't used that platform.

But start doing something, create a repo and work on it, ask for help and send the url so people can help. Join dedicated slack channels for the programming language you want to learn and you will get help.

HowDoIMakeStuff commented 2 years ago

In my opinion, a good start to learn is to create an online shop. PHP is a very good candidate for this. But since you are at the beginning, start without a framework; codeigniter is one of the simplest, but lack of features, while symfony framework is the best in my opinion, but difficult for a beginner.

Those frameworks use the MVC (Model View Controller) concept and would be good to understand it.

You can start as well by following a tutorial I wrote for symfony 3.4 a while ago that will go into more use cases. If you follow the tutorial and have issues, feel free to contact me and I'll help you.

Now, getting back to an online shop. What you will cover during this path will be:

  • learn to create a project structure with all the requirements
  • learn design patterns and MVC
  • learn code collaboration tools like GIT (I prefer GITLAB instead of github, but that is up to you)
  • learn PHP if you choose it as starting point which is not difficult
  • learn how to use a database (MySQL, Postgres)
  • learn how to send emails from the website to the customers (registration, placing order, etc)
  • learn how to implement a layout in HTML and CSS (bootstrap templates are quite common and you can find them free)
  • learn how to use Javascript and NodeJS with your website (ajax calls) (By the way, Java and JavaScript are two different things, don't confuse them)
  • learn how to install PHP, NGINX server or Apache2 on a server
  • learn how to install the database on a different server and use IPtables to allow traffic only from the webserver to the database server. You can use AWS (Amazon Web Services) and then you need to configure SecurityGroups that you'll apply to your resources.
  • learn how to secure your server since you'll get attacks from the first second (bots, web crawlers, web scanners, etc)
  • learn how to authenticate on the server without using a password but using a private key (ssh-keygen) - is necessary for git as well
  • learn terraform to create your infrastructure on the cloud (AWS, GCP, Azure, Hetzner, and many more)
  • learn how to optimise your code and queries to the database (SELECT * FROM table_name is bad practice)

There are a lot more things to learn on this.

If you want only to master codecrafters, then this might not help too much, I haven't used that platform.

But start doing something, create a repo and work on it, ask for help and send the url so people can help. Join dedicated slack channels for the programming language you want to learn and you will get help.

Had a look at your tutorial, unfortunately I don't have a build of Linux to run this on. I'm running Windows 10.

But also, don't I need to learn what a "framework" is? And what the "Model View Controller" concept is? And then there's all the stuff in those bullet points you listed. Are they in the Symfony tutorial? Where would I learn that stuff? I know I need to learn to create a project structure and design patterns, but when do I learn what those words mean? Because I don't even know that much.

I'd like to start on this path, but I don't know where this path is. Is there a particular class I'm supposed to take? Some particular book I'm supposed to read? And then what from there? Where did you learn what the "Model View Controller" concept was?

bogdan-rizac commented 2 years ago

have a look on the frameworks documentations. they will explain the architecture and the concepts. for example this one https://www.codeigniter.com/user_guide/concepts/mvc.html

my tutorial shows how to do some things, for the rest of them it must come from your side. You have to start searching and reading the documentation.

HowDoIMakeStuff commented 2 years ago

have a look on the frameworks documentations. they will explain the architecture and the concepts. for example this one https://www.codeigniter.com/user_guide/concepts/mvc.html

my tutorial shows how to do some things, for the rest of them it must come from your side. You have to start searching and reading the documentation.

Is there any way I can check the history of this repository and ask the people who added these Codecrafters tests? And maybe ask them what stuff I should read/know before attempting these?

MuhammedZakir commented 2 years ago

CS50 course may help you -- https://cs50.harvard.edu/x/.

My suggestion is different from @bogdan-rizac in that, I wouldn't recommend learning a programming language using a framework. Framework imposes their own little DSLs on top of the programming language which makes learning harder. You can start with it if you have to build something using that framework very soon; in such cases, "quick learning" is more important than "correct learning".

Anyway, I recomment you to just choose a programming language and start learning it. Pick what you will most likely work with later on, or pick a random language (I don't know, maybe JS?). For JS, this may help -- https://javascript.info/.

Another good site is https://www.freecodecamp.org/.

bogdan-rizac commented 2 years ago

@MuhammedZakir well, I don't recommend either to start with a framework, but so far he said he wants to master the codecrafter tests, which also, I don't recommend to focus on tests online unless you want to pass an exam or an interview. But I had cases in my past where I had to hire people, they made the tests perfect and when they had a real use case in the live application they didn't know how to do anything. guess what happened next ...

HowDoIMakeStuff commented 2 years ago

@MuhammedZakir well, I don't recommend either to start with a framework, but so far he said he wants to master the codecrafter tests, which also, I don't recommend to focus on tests online unless you want to pass an exam or an interview. But I had cases in my past where I had to hire people, they made the tests perfect and when they had a real use case in the live application they didn't know how to do anything. guess what happened next ...

Well, I call them "tests" but they're not really tests. They're "making things." And if I can make things/put together a nice portfolio, people might want to have me on their team. Or even lead someday. I think I should know how to make a shop too, but also a web server and a Regex engine and everything else in the repository. And more. I want a portfolio that says "Here's all the stuff I understand, if you need me to make this or work on this, I'm your guy."

CS50 course may help you -- https://cs50.harvard.edu/x/.

My suggestion is different from @bogdan-rizac in that, I wouldn't recommend learning a programming language using a framework. Framework imposes their own little DSLs on top of the programming language which makes learning harder. You can start with it if you have to build something using that framework very soon; in such cases, "quick learning" is more important than "correct learning".

Anyway, I recomment you to just choose a programming language and start learning it. Pick what you will most likely work with later on, or pick a random language (I don't know, maybe JS?). For JS, this may help -- https://javascript.info/.

Another good site is https://www.freecodecamp.org/.

So I could start with these sites from zero? There are no prerequisites? I'm not gonna be going along and then be introduced to a topic I'm not prepared for?

MuhammedZakir commented 2 years ago

So I could start with these sites from zero?

Most probably, yes.

There are no prerequisites?

IIRC, if there are any prerequisites, those sites will mention them.

I'm not gonna be going along and then be introduced to a topic I'm not prepared for?

Most probably, you will encounter unfamiliar terms. Like I said before, learning without encountering unfamiliar terms is quite impossible. When encountering unfamiliar terms, just learn what it is. Don't bother about "how" or "why" of those terms. Most of the times, "how" and "why" parts will come naturally to you when you get more experience.

HowDoIMakeStuff commented 2 years ago

So I could start with these sites from zero?

Most probably, yes.

There are no prerequisites?

IIRC, if there are any prerequisites, those sites will mention them.

I'm not gonna be going along and then be introduced to a topic I'm not prepared for?

Most probably, you will encounter unfamiliar terms. Like I said before, learning without encountering unfamiliar terms is quite impossible. When encountering unfamiliar terms, just learn what it is. Don't bother about "how" or "why" of those terms. Most of the times, "how" and "why" parts will come naturally to you when you get more experience.

Well, when I look up "what" something is, that leads to more terms I don't know. For instance, say I wanna build a "template engine." Wait, what IS a "template engine?" I look it up.

https://en.wikipedia.org/wiki/Template_processor

A template processor (also known as a template engine or template parser) is software designed to combine templates with a data model to produce result documents.

Wait, but what is a "template" in this context? And what's a "data model?"

https://en.wikipedia.org/wiki/Data_model

A data model [1][2][3][4][5] is an abstract model that organizes elements of data and standardizes how they relate to one another and to the properties of real-world entities.

So far I don't feel like I've learned anything about what a "template engine" is, but also I feel like you guys know what it is and could explain it in simpler terms than Wikipedia is doing.

bogdan-rizac commented 2 years ago

In my opinion you are loosing your time with staff that really doesn't matter. Most of those terms are intuitive. Nobody will do rubber duck programming with you to explain every single term you can google yourself and get a rough idea about them. It is equal to zero if you know all those terms but you don't know what to do with them and how to glue them together. Even in your examples from wikipedia, there are links to the explanations for those terms.

The only golden solution for your quest, is to start doing something as small as possible and grow it from there.

And don't build a template engine, at least not at the level I believe you are right now. Use one first, see how it behaves, use another one, make a comparison and if you think you can bring improvements, contribute or build you'r own. Just for your information, TWIG (from php) is very similar to Jinja (from python) and they were both started by the same author. Then, twig was taken over by symfony framework developers.

There are a lot of template engines already in all programming languages you know or might not know. Each of them has its own pros and cons.

You don't learn those things just by asking or someone telling you about them, you learn them by working with them yourself, getting into problems and solve them. The more errors and problems you get, the more you'll learn.

You won't learn how to drive a car from stories from other drivers, but you'll learn when you'll start driving.

HowDoIMakeStuff commented 2 years ago

But the thing is, I don't even know what a template engine is. I've never heard of one. I've heard of cars, I could just practice driving a car instead of researching what a car "is." But a "template engine," I can't even practice using one if I don't know what it is. I wouldn't know where to find one or what to do with it. It's entirely alien to me. I don't know what TWIG or Jinja are or what I would do with them. Or what "improves" a template engine. As far as I know, whatever template engine I use is perfect.

For instance, I'm using these Github forums right now. If you asked me "How would you improve the forums" I'd be like "I dunno, they seem fine to me."

bogdan-rizac commented 2 years ago

Read this:

MuhammedZakir commented 2 years ago

You are wasting too much time on unnecessary stuff when trying to learn, like @bogdan-rizac said. I will just explain with a simple example what you're currently trying to do:

Say if you are learning to drive. What we do is roughly:

  1. Know required stuff (in informal terms):
    • steering: to change direction.
    • clutch: should be pressed while changing the gear.
    • gear lever: to change gear.
    • brake: for breaking / to slow down.
    • handbrake: when parking.
    • accelerator: to go faster.
  2. Practice.
  3. Maybe, if you're the curious type, learn about what happens when you do stuff.

But, what you are trying to do is:

  1. Learn about ignition system, transmission, gearbox, clutch pads, shafts and levers, hydraulic system, what happens when you use steering, what happens when you depress cluch and break pads, learning that accelerator is not actually about going faster, and a plethora of other stuff.
  2. Learn how to drive.
  3. Practice.

In the 2nd case, the only* thing that's going to happen is being overwhelmed by these knowledge and most probably, give up learning it, and if you had to learn it, start again, but this time, following 1st way.

* I won't say learning via 2nd case is impossible, but it is definitely near impossible.

ebresie commented 2 years ago

Should take a step back as well and think about what is your goal and what interest you. This can allow you to focus on things that are important to this.

Also realize that as with any subject, there may be some foundation to start with before tackling a grand scale element. In other words you have to learn to walk before you can run.

For example if you want to be a web developer then in that "domain" it would be necessary to learn basic skills for the "front end" (what shows on you view in the browse) and other skills for the "back end" (what runs on your server to product the response shown in the browse).

For "front end" it would be necessary to learn skills like html,css, javascript for foundation and then build on that with more advances elements like any assorted web frameworks with specific functionality or features needed for the project.

For "back end" it would be necessary to learn skills like server side languages like php, Java, etc.

If working embedded systems then the needs of that domain are different as that moves into C/C++/Assembly, etc. with each of which being constrained by the Target hardware and operating system.

In the end, this is a learning journey...

HowDoIMakeStuff commented 2 years ago

You are wasting too much time on unnecessary stuff when trying to learn, like @bogdan-rizac said. I will just explain with a simple example what you're currently trying to do:

Say if you are learning to drive. What we do is roughly:

  1. Know required stuff (in informal terms):

    • steering: to change direction.
    • clutch: should be pressed while changing the gear.
    • gear lever: to change gear.
    • brake: for breaking / to slow down.
    • handbrake: when parking.
    • accelerator: to go faster.
  2. Practice.
  3. Maybe, if you're the curious type, learn about what happens when you do stuff.

But, what you are trying to do is:

  1. Learn about ignition system, transmission, gearbox, clutch pads, shafts and levers, hydraulic system, what happens when you use steering, what happens when you depress cluch and break pads, learning that accelerator is not actually about going faster, and a plethora of other stuff.
  2. Learn how to drive.
  3. Practice.

In the 2nd case, the only* thing that's going to happen is being overwhelmed by these knowledge and most probably, give up learning it, and if you had to learn it, start again, but this time, following 1st way.

  • I won't say learning via 2nd case is impossible, but it is definitely near impossible.

But returning to my analogy, what if I had never heard of what a "car" was? What if I didn't know that on Earth, people use things called "roads" to direct wheeled machines around in the name of transporting people and things to places? How could I even begin to practice how to drive? You put me in front of the steering wheel and I don't even know what I'm looking at.

That's where I am with software development.

Should take a step back as well and think about what is your goal and what interest you. This can allow you to focus on things that are important to this.

Also realize that as with any subject, there may be some foundation to start with before tackling a grand scale element. In other words you have to learn to walk before you can run.

For example if you want to be a web developer then in that "domain" it would be necessary to learn basic skills for the "front end" (what shows on you view in the browse) and other skills for the "back end" (what runs on your server to product the response shown in the browse).

For "front end" it would be necessary to learn skills like html,css, javascript for foundation and then build on that with more advances elements like any assorted web frameworks with specific functionality or features needed for the project.

For "back end" it would be necessary to learn skills like server side languages like php, Java, etc.

If working embedded systems then the needs of that domain are different as that moves into C/C++/Assembly, etc. with each of which being constrained by the Target hardware and operating system.

In the end, this is a learning journey...

Exactly. I want to learn to walk before I can run, I'm asking what it is I need to learn before I try Codecrafters.

My goals? Like, as a career? I'd like to work on the full stack. So I want to show people a portfolio with a variety of projects in it. That's why I'd like to eventually do Codecrafters. So people will say "Wow, that guy made his own operating system. Wow, that guy made his own Notepad. Wow, that guy made his own Twitter. Wow, that guy made his own 3D renderer, physics engine, and video game." If I show people that I can make all of those things, maybe they'll let me work on a variety of things.

bogdan-rizac commented 2 years ago

My goals? Like, as a career? I'd like to work on the full stack. So I want to show people a portfolio with a variety of projects in it. That's why I'd like to eventually do Codecrafters. So people will say "Wow, that guy made his own operating system. Wow, that guy made his own Notepad. Wow, that guy made his own Twitter. Wow, that guy made his own 3D renderer, physics engine, and video game." If I show people that I can make all of those things, maybe they'll let me work on a variety of things.

To me, this looks like you're looking for fame, not for a career. Stop dreaming and start learning. Do something. Learn something. You'll get to that level after 10-20 years of working on various projects. Nobody will prise you just because you did a challenge on codecrafters or any other platform. It will happen that during interviews they will give you challenges to solve algorithms and once you get the job, you'll only fix bugs from a legacy code written 10 years ago which has nothing to do with the algorithms. Don't believe that once you get a job you'll be treated like a princess and you'll get only the most exciting projects because you'll be very disappointed on your first week. The percentage of legacy code (old code written by other teams or is too old and dangerous to be touched/changed, even a 1 year or a few months code base can be named legacy) that exists is very high and nobody wants to recreate it because there are no funds or time.

And regarding making your own operating system, your own 3D rendering engine, your own video game ? Couldn't you choose something more difficult than that ? What you're using and see in an OS is maybe 10% from what an OS can really do. And for the others, there are already engines and platforms that you can use and not to reinvent the wheel. Well, you can reinvent it, but make sure you bring innovations on the table.

Choose a clear path and stick with it. For me, "fullstack" developer does not mean you can create an OS, video game, rendering engine, etc. C++, Java, .NET and others, are programming languages that you'll need almost a lifetime to master only one of them. And technology advances at very high rate. By the time you learn something and master it, is already obsolete.

P.S. If you want to learn to drive and you don't know what a road is, then you shouldn't drive at all. You have to understand that there are things that you learn in time, step by step, and there are things that you learn outside of the main context.

When I was in university, one of the teacher told us: "A good engineer is not the one who knows how to do everything, but the one who knows where to look for answers"

ebresie commented 2 years ago

have a look on the frameworks documentations. they will explain the architecture and the concepts. for example this one https://www.codeigniter.com/user_guide/concepts/mvc.html

my tutorial shows how to do some things, for the rest of them it must come from your side. You have to start searching and reading the documentation.

Is there any way I can check the history of this repository and ask the people who added these Codecrafters tests? And maybe ask them what stuff I should read/know before attempting these?

For the "codecrafters-io/build" site, this is mainly a pointer to external tutorials or to other "codecrafters" subprojects. To see the history of this (and on other git repositories), Can look on GitHub, looking for commits or "pull requests" (PR) with eh actual changes or with basic "git" for the "commits" that occurred or when looking at the files, may be able to see what the last commit is.

Pull the code down from GitHub using git and use the basic "git log -- " commands to see what changes have happened.

So in the end this means, learn how to use "git".

ebresie commented 2 years ago

Should take a step back as well and think about what is your goal and what interest you. This can allow you to focus on things that are important to this.

Also realize that as with any subject, there may be some foundation to start with before tackling a grand scale element. In other words you have to learn to walk before you can run.

For example if you want to be a web developer then in that "domain" it would be necessary to learn basic skills for the "front end" (what shows on you view in the browse) and other skills for the "back end" (what runs on your server to product the response shown in the browse).

For "front end" it would be necessary to learn skills like html,css, javascript for foundation and then build on that with more advances elements like any assorted web frameworks with specific functionality or features needed for the project.

For "back end" it would be necessary to learn skills like server side languages like php, Java, etc.

If working embedded systems then the needs of that domain are different as that moves into C/C++/Assembly, etc. with each of which being constrained by the Target hardware and operating system.

In the end, this is a learning journey...

Exactly. I want to learn to walk before I can run, I'm asking what it is I need to learn before I try Codecrafters.

My goals? Like, as a career? I'd like to work on the full stack. So I want to show people a portfolio with a variety of projects in it. That's why I'd like to eventually do Codecrafters. So people will say "Wow, that guy made his own operating system. Wow, that guy made his own Notepad. Wow, that guy made his own Twitter. Wow, that guy made his own 3D renderer, physics engine, and video game." If I show people that I can make all of those things, maybe they'll let me work on a variety of things.

Okay so with any goal, it's a good idea to ensure the goal is "quantifiable" or "actionable" (i.e. not too abstract - I want to be good in x; what is meant by "good"?), so if the goal is, I want to be a good developer (that's very general); if it's I want to be an expert in full stack that narrows it down some.

So with the goal, if it's too broad, then break it down into smaller sub-tasks. So "want to be a good web developer", then break it down into (1) learn about front end technologies, (2) learn about back end technologies. Now for each of these they can be broken down further. So for (1) it would be (1.1) learn basic technologies (HTML, CSS, JavaScripts) (1.2) learn advances technologies (i.e. frameworks). So for (1.1) then break those down for each so for HTML, break it down further to something like (1.1.1) "read tutorial/book/article about HTML")

It's good to know how to measure progress to determine that it's accomplished. How do you determine if your good at thing x? As mentioned above, if you have sub-tasks completed, that is one way of showing progress.

Keeping in mind, different people learn in different ways. Some learn better by reading, others listening, others by doing which trains yourself and/or proves what you learned. So the general practices in learning is to figure out what works best for you and try to establish your learning practices to help in learning. In general when learning things, practice helps a lot to reflect what your understanding is...that's why in school and other classes, they often times provide "quiz" or "projects" to see if what is learned has been comprehended. These articles references here help in this respect.

Another approach is to actually "write about what you believe you've learn"...this has benefits for you in that it shows what you learned, allows you to practice, and it can help others learn as well. There is a possibility some of what it put down may not be right in which case it gives an opportunity for others to review and provide feedback (in development this can also be thought of of a "peer review") if needed; or it is correct in which case others can praise or recognize your accomplishment (i.e. thumbs up :-))

Not trying to sound like an advertisement but in my journey, I found and recommended looking into a concept called "GTD" or "Getting Things Done". It helps in gaining focus and becoming more productive. The short of it is, in our brain we have a million things we want to do but either lose site of these or keep it inside which may stress you out. This recommends make a TODO list to put it down and not stress about not getting it done. These items can be broken down and reviewed. Then can pick your "next thing" and act on it. This is not a "technology" per say but a practice for personal productivity. When applied to your journey it may help.

HowDoIMakeStuff commented 2 years ago

Should take a step back as well and think about what is your goal and what interest you. This can allow you to focus on things that are important to this.

Also realize that as with any subject, there may be some foundation to start with before tackling a grand scale element. In other words you have to learn to walk before you can run.

For example if you want to be a web developer then in that "domain" it would be necessary to learn basic skills for the "front end" (what shows on you view in the browse) and other skills for the "back end" (what runs on your server to product the response shown in the browse).

For "front end" it would be necessary to learn skills like html,css, javascript for foundation and then build on that with more advances elements like any assorted web frameworks with specific functionality or features needed for the project.

For "back end" it would be necessary to learn skills like server side languages like php, Java, etc.

If working embedded systems then the needs of that domain are different as that moves into C/C++/Assembly, etc. with each of which being constrained by the Target hardware and operating system.

In the end, this is a learning journey...

Exactly. I want to learn to walk before I can run, I'm asking what it is I need to learn before I try Codecrafters. My goals? Like, as a career? I'd like to work on the full stack. So I want to show people a portfolio with a variety of projects in it. That's why I'd like to eventually do Codecrafters. So people will say "Wow, that guy made his own operating system. Wow, that guy made his own Notepad. Wow, that guy made his own Twitter. Wow, that guy made his own 3D renderer, physics engine, and video game." If I show people that I can make all of those things, maybe they'll let me work on a variety of things.

Okay so with any goal, it's a good idea to ensure the goal is "quantifiable" or "actionable" (i.e. not too abstract - I want to be good in x; what is meant by "good"?), so if the goal is, I want to be a good developer (that's very general); if it's I want to be an expert in full stack that narrows it down some.

So with the goal, if it's too broad, then break it down into smaller sub-tasks. So "want to be a good web developer", then break it down into (1) learn about front end technologies, (2) learn about back end technologies. Now for each of these they can be broken down further. So for (1) it would be (1.1) learn basic technologies (HTML, CSS, JavaScripts) (1.2) learn advances technologies (i.e. frameworks). So for (1.1) then break those down for each so for HTML, break it down further to something like (1.1.1) "read tutorial/book/article about HTML")

It's good to know how to measure progress to determine that it's accomplished. How do you determine if your good at thing x? As mentioned above, if you have sub-tasks completed, that is one way of showing progress.

Keeping in mind, different people learn in different ways. Some learn better by reading, others listening, others by doing which trains yourself and/or proves what you learned. So the general practices in learning is to figure out what works best for you and try to establish your learning practices to help in learning. In general when learning things, practice helps a lot to reflect what your understanding is...that's why in school and other classes, they often times provide "quiz" or "projects" to see if what is learned has been comprehended. These articles references here help in this respect.

Another approach is to actually "write about what you believe you've learn"...this has benefits for you in that it shows what you learned, allows you to practice, and it can help others learn as well. There is a possibility some of what it put down may not be right in which case it gives an opportunity for others to review and provide feedback (in development this can also be thought of of a "peer review") if needed; or it is correct in which case others can praise or recognize your accomplishment (i.e. thumbs up :-))

Not trying to sound like an advertisement but in my journey, I found and recommended looking into a concept called "GTD" or "Getting Things Done". It helps in gaining focus and becoming more productive. The short of it is, in our brain we have a million things we want to do but either lose site of these or keep it inside which may stress you out. This recommends make a TODO list to put it down and not stress about not getting it done. These items can be broken down and reviewed. Then can pick your "next thing" and act on it. This is not a "technology" per say but a practice for personal productivity. When applied to your journey it may help.

More specific about my goals as a full stack developer? I'm not sure how much more specific I can be. Do you mean what company I want to work for? Maybe I don't know enough about software development to know how much more specific I can be.

My goals? Like, as a career? I'd like to work on the full stack. So I want to show people a portfolio with a variety of projects in it. That's why I'd like to eventually do Codecrafters. So people will say "Wow, that guy made his own operating system. Wow, that guy made his own Notepad. Wow, that guy made his own Twitter. Wow, that guy made his own 3D renderer, physics engine, and video game." If I show people that I can make all of those things, maybe they'll let me work on a variety of things.

To me, this looks like you're looking for fame, not for a career. Stop dreaming and start learning. Do something. Learn something. You'll get to that level after 10-20 years of working on various projects. Nobody will prise you just because you did a challenge on codecrafters or any other platform. It will happen that during interviews they will give you challenges to solve algorithms and once you get the job, you'll only fix bugs from a legacy code written 10 years ago which has nothing to do with the algorithms. Don't believe that once you get a job you'll be treated like a princess and you'll get only the most exciting projects because you'll be very disappointed on your first week. The percentage of legacy code (old code written by other teams or is too old and dangerous to be touched/changed, even a 1 year or a few months code base can be named legacy) that exists is very high and nobody wants to recreate it because there are no funds or time.

And regarding making your own operating system, your own 3D rendering engine, your own video game ? Couldn't you choose something more difficult than that ? What you're using and see in an OS is maybe 10% from what an OS can really do. And for the others, there are already engines and platforms that you can use and not to reinvent the wheel. Well, you can reinvent it, but make sure you bring innovations on the table.

Choose a clear path and stick with it. For me, "fullstack" developer does not mean you can create an OS, video game, rendering engine, etc. C++, Java, .NET and others, are programming languages that you'll need almost a lifetime to master only one of them. And technology advances at very high rate. By the time you learn something and master it, is already obsolete.

P.S. If you want to learn to drive and you don't know what a road is, then you shouldn't drive at all. You have to understand that there are things that you learn in time, step by step, and there are things that you learn outside of the main context.

When I was in university, one of the teacher told us: "A good engineer is not the one who knows how to do everything, but the one who knows where to look for answers"

But I'm not looking for fame. The reason I want to do Codecrafters is because, as far as I understand, you need a portfolio of work to show prospective employers. Or at least that's what mentors on LinkedIn tell me. They say things like "Find a way to stand out, I made this video game and Microsoft hired me as a senior software engineer."

So I wanna do Codecrafters, so I can make my own operating system and Notepad and video game and et cetera so I can make a portfolio of work out of them. Things more difficult than that? Sure, if I ever learn how to do those things. But right now I don't know how to make anything.

And yes, I agree that if I don't know what a road is, then I shouldn't drive yet. But where would I start? If I don't know what a road is and I want to drive someday?

bogdan-rizac commented 2 years ago

You got me wrong here. I was ironic when I asked if you could pick something more difficult. The thing is that an operating system, a 3d rendering engine, a game are quite difficult to do. But for those things there are frameworks and platforms. For example, you have Unity.

On linkedin, the teachers tell you to create a portofolio (I guess) if you want to become a designer or a frontend developer. But for a fullstack developer, is more important how you'll do the things behind the scenes. I've been working as a fullstack web developer with PHP for more than 18 years and then swiched to Devops. My first job was as a content manager on a CMS platform and there I could learn something more about websites and how to make them. Then, I moved on into creating websites at another company and learned even more from my colleagues and projects.

You won't be able to learn in 1-2 months what others learn in years. Get a starting job and grow from there

bogdan-rizac commented 2 years ago

Another thing, it matters where you are located. For example, what works very well in US, doesn't work in EU or ASIA. What works well in EU, doesn't work in US. I am talking about jobs specifications, requirements, availability. You should take this consideration as well. There are different markets where people have different mindsets and the society requirements and needs are totally different.

Age is also an important factor. If you are around 20, then you are full of luck. Get a job anywhere in a domain you are interested into and learn as much as possible from everyone around you. Spend at least the next 5-10 years to learn everything you consider useful or interesting. This will be a lot more valuable than those projects from the various platforms.

When I am hiring people, I am interested in how they think and how they can solve problems, real ones, not in the projects created by following online tutorials.

HowDoIMakeStuff commented 2 years ago

You got me wrong here. I was ironic when I asked if you could pick something more difficult. The thing is that an operating system, a 3d rendering engine, a game are quite difficult to do. But for those things there are frameworks and platforms. For example, you have Unity.

On linkedin, the teachers tell you to create a portofolio (I guess) if you want to become a designer or a frontend developer. But for a fullstack developer, is more important how you'll do the things behind the scenes. I've been working as a fullstack web developer with PHP for more than 18 years and then swiched to Devops. My first job was as a content manager on a CMS platform and there I could learn something more about websites and how to make them. Then, I moved on into creating websites at another company and learned even more from my colleagues and projects.

You won't be able to learn in 1-2 months what others learn in years. Get a starting job and grow from there

Meant to reply to this...

Operating systems and 3D renderers are on Codecrafters. That's where I got those.

https://github.com/codecrafters-io/build-your-own-x#build-your-own-operating-system

https://github.com/codecrafters-io/build-your-own-x#build-your-own-3d-renderer

Codecrafters has instructions on how to make an operating system, a 3D renderer, a physics engine, an augmented reality image generator (most of which use Unity stuff, it seems), Command Line tools, a "database" (whatever they mean by that), a "front-end framework" (whatever they mean by that), a "network stack" (another thing I don't know), a neural network, a "template engine," a "Regex engine," a "shell," a search engine (even in CSS), an image recognition system, a voxel engine, web servers, Facebook/Twitter/Reddit/IRC/Slack bots, your own programming language, your own cryptocurrency, your own video game, your own video game emulator, your own Notepad, your own Docker, your own BitTorrent, your own GitHub...

...and a lot more. So if I can do all these things on Codecrafters and have that in my portfolio, I thought that would make me attractive as a candidate.

But you're saying if I want to be a full stack developer, I should NOT build a portfolio? I should instead get a "starting job?" Well, how do I qualify for one of those? Where do I start? And what is the path from there to becoming a full stack developer? Whether it be Codecrafters or anything else, I'm not trying to master it in 2 months. I'll commit however much time it takes, I just wanna know where I'm supposed to start and what I should be doing subsequently.