source: content/en/posts/web-stacks.org@ 2476eba

Last change on this file since 2476eba was 2476eba, checked in by w96k <w96k.ru@…>, on Oct 14, 2022 at 3:10:27 PM

Apply fixes from Andre

  • Property mode set to 100644
File size: 29.3 KB
Line 
1#+TITLE: Technologies of web development
2#+DATE: <2022-10-11 Tue>
3#+LANGUAGE: en
4
5* Technologies of web development
6#+BEGIN_abstract
7In this article I shall categorize languages, frameworks, libraries and
8software by a criteria of usage such technologies at hired work. Be
9aware that opinions expressed in the article might be biased and
10irrational.
11#+END_abstract
12
13I work in the IT field as a web developer for many years, but cannot
14proudly claim myself as a professional. I don't know many things, I
15don't like corporate IT culture and I don't particularly like web
16development. Still I have an experience in the field, and it is much
17easier to dive into web development to earn money for a living than to
18devote my time to other professions at my location. I hope this text
19will be useful for someone who is outside of the field of web
20development to get a grasp which technologies to learn.
21
22* What is tech stack
23#+BEGIN_abstract
24A tech stack is a the mix of technologies (software, frameworks,
25libraries) that the projects use to implement a planned set of features.
26#+END_abstract
27
28Knowing everything from your tech stack is not the only key to
29success. It can sound obvious, but social skills can play a more
30important role than your programming skills. Programming is a social
31activity as most of what, everything you are going to use is built by
32other people. Sometimes things break and you need to contact them. It is
33also important to communicate well with your company's team to avoid
34conflicts. And don't be that guy (me!), who hates something and gets
35verbal about it in such a way. This doesn't help you in any way. It can
36be seen as a suppression of your ego, but the truth is that hired work
37is more about collectivism than individualism.
38
39Next, I present the list of technologies you should be comfortable with
40to work as a web developer. The list is not mandatory and you are not
41required to learn it on an expert level to get your job offer.
42
43* Technologies to learn
44Some things you will use in most of your projects, so you are better to
45familiarize yourself with them anyway. What I've discovered, is that
46most knowledge of some tech is transferable to other techs. For example,
47learning one web-framework helps you to learn others.
48
49** Text Editor
50Not sure if I need to write it, but you need a development environment
51where you will write code, run tests and compile your project.
52
53*Most popular choices*
54- [[https://gnu.org/software/emacs/][Emacs]] / [[https://www.vim.org/][Vim]] (I recommend them in the long run)
55- Jetbrains IDE (proprietary)
56- VSCode (proprietary)
57
58*Less popular*
59- Sublime (proprietary)
60- [[https://www.eclipse.org/][Eclipse]] / [[https://netbeans.apache.org/][Netbeans]] / [[https://www.kdevelop.org/][Kdevelop]]
61- other editors and IDEs
62
63Proprietary means that source code is not available and probably it
64costs money, so you, as a user, don't have control over it. You can
65learn more why it is important on the [[https://gnu.org/philosophy/][GNU website]]. Such an important
66tool as a text editor should be free as in freedom for everyone.
67
68[[[https://en.wikipedia.org/wiki/Text_editor][Wikipedia: Text editor]]] | [[[https://en.wikipedia.org/wiki/Integrated_development_environment][Wikipedia: Integrated development
69environment]]]
70
71** SQL
72Or it should be called persistence, but mostly you will use something
73like [[https://www.postgresql.org/][Postgres]] or [[https://mariadb.com/kb/en/][MariaDB]]/[[https://mysql.com/][MySQL]]. Rarely it can be NoSQL like MongoDB.
74
75The database is the main thing around which you will develop your
76application. I would say that the code is secondary compared to the data
77you store and get from the database, so it is an extremely good idea to
78learn SQL well, especially in the long run. For the start, it is okay to
79know a little and get going along the way because you will probably work
80with SQL through ORM.
81
82I recommend using [[https://dbeaver.io/][Dbeaver]] as IDE for running SQL-related code. It eases
83the complexity of writing and running SQL.
84
85[[[https://en.wikipedia.org/wiki/SQL][Wikipedia: SQL]]] | [[[https://en.wikipedia.org/wiki/Relational_database][Wikipedia: Reletational Database]]]
86
87*** ORM
88Each tech stack provides ORM. ORM allows you to operate your database
89"objects" as your programming language code without writing or
90minimizing writing raw SQL. It is quite rare when you need to work with
91pure SQL or the project doesn't use ORM at all. ORMs might be something
92from the list:
93- [[https://hibernate.org/][Hibernate]]
94- [[https://docs.djangoproject.com/][Django ORM]]
95- [[https://www.doctrine-project.org/][Doctrine]]
96- [[https://sqlalchemy.org/][SQLAlchemy]]
97- [[https://guides.rubyonrails.org/active_record_basics.html][Rails Active Record]]
98- and many others
99
100[[[https://en.wikipedia.org/wiki/SQL][Wikipedia: SQL]]] | [[[https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping][Wikipedia: ORM]]]
101
102** In-memory database
103Most databases use hard drives to store data, but some data needs to be
104stored in RAM for better performance. For that cases you need to learn
105about Redis or similar technology. Such databases are:
106- [[https://en.wikipedia.org/wiki/Redis][Redis]]
107- [[https://en.wikipedia.org/wiki/Memcached][Memcached]]
108
109[[[https://en.wikipedia.org/wiki/In-memory_database][Wikipedia: In-memory database]]]
110
111** HTTP Server and HTTP protocol
112You don't need to know everything from the start, but since you are
113going to work as a web dev you need to know what you are using. It is
114essential if you do backend APIs.
115
116The HTTP server is usually [[https://en.wikipedia.org/wiki/Nginx][Nginx]] or [[https://en.wikipedia.org/wiki/Apache_HTTP_Server][Apache]] (it is used rarely now). If
117you work with Java, HTTP servers can be written in Java such as [[https://en.wikipedia.org/wiki/Jetty_(web_server)][Jetty]]
118and others.
119
120I recommend reading [[https://amazon.com/HTTP-Definitive-Guide-Guides/dp/1565925092][a book called "HTTP: The Definitive Guide: The
121Definitive Guide"]].
122
123[[[https://en.wikipedia.org/wiki/Web_server][Wikipedia: Web server]]] | [[[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol][Wikipedia: Hypertext Transfer Protocol]]]
124
125** Fulltext search
126You might need searching functionality. It is okay to include google
127search in basic cases, but it is not an acceptable choice in many
128cases. To search like google does you will need full-text search
129engines. You can use your database for that or specific solutions like
130[[https://www.elastic.co/elasticsearch/][ElasticSearch]] for such purposes.
131
132[[[https://en.wikipedia.org/wiki/Full-text_search][Wikipedia: Full-text search]]] | [[[https://en.wikipedia.org/wiki/Elasticsearch][Wikipedia: Elasticsearch]]] (proprietary)
133
134** Message broker
135RabbitMQ, ZeroMQ, Kafka and others. You need those to create queues and
136other stuff that needs to be delayed. It is used because some languages
137have limitation to implement such functionality, for example PHP.
138
139[[https://en.wikipedia.org/wiki/Message_broker][Wikipedia: Message Broker]]
140
141** Unix-like OS
142You will probably work on Linux, variants of BSD systems, or macs. You
143need to familiarize with the system you use as different tasks require
144different degrees of that skill, but knowledge of what you are using
145every day will be handy.
146
147There are many ways to learn it, but I recommend trying to install it on
148your machine and learning it along the way. I recommend to starting with
149[[https://debian.org/][Debian GNU/Linux distribution]]. You can read [[https://www.debian.org/doc/manuals/debian-faq/][FAQs]], manuals about
150[[https://www.debian.org/releases/stable/amd64/index.en.html][installation]] and [[https://www.debian.org/doc/manuals/debian-reference/][how to use the system]]. Docs are very useful and they
151are will be present in your filesystem so you can read them by jumping
152into /usr/share/docs folder or running ~info~ and ~man~ commands. I
153recommend reading it and exploring the Debian website. Also for learning
154Linux, Arch Linux wiki is a good source of knowledge (Slackware and
155Gentoo wikis are good as well).
156
157[[[https://en.wikipedia.org/wiki/Unix][Wikipedia: Unix]]] | [[[https://en.wikipedia.org/wiki/Linux][Wikipedia: Linux]]] | [[[https://en.wikipedia.org/wiki/Linux_distribution][Wikipedia: Linux distribution]]]
158
159** Docker
160Your team probably will use docker for deployment or development (or
161both). You might want to get your project working in a container for
162better accessibility by your team. The point of docker as a development
163tool is to let your team quickly get the same environment as you. The
164point of docker as a deployment tool is to deploy the same environment
165that you develop in. It is important to have a reproducible production
166environment because catching bugs in 3 different environments (dev,
167staging, prod) sucks.
168
169[[[https://en.wikipedia.org/wiki/Docker_(software)][Wikipedia: Docker]]]
170
171** CI/CD and Deployment
172You need to be able to deploy your application to the production
173server. Good practice is to use a CI/CD pipeline. The CI/CD pipeline
174runs checks of your project in a docker container and when the tests are
175successful, the code deploys to production.
176
177There is also an old approach with logging into your server via a small
178script by ssh and then deploying everything as you just move files
179manually.
180
181- [[https://www.jenkins.io/][Jenkins]]
182- [[https://www.buildbot.net/][Buildbot]]
183
184[[[https://en.wikipedia.org/wiki/CI/CD][Wikipedia: CI/CD]]] | [[[https://en.wikipedia.org/wiki/Software_deployment][Wikipedia: Software Deployment]]]
185
186** OOP
187You will be probably forced to use OOP techniques in corporate IT
188culture. It is not something that improves development that much, but it
189is a very common way to organize codebase and it is kind of great for
190working with many people. If you ask me, I would say that [[https://en.wikipedia.org/wiki/Closure_(computer_programming)][Closures]] and
191[[https://en.wikipedia.org/wiki/Modular_programming][Modules]] are much more game-changing tech improvements that happened in
192computer science than OOP.
193
194Not everyone will agree with my definition, but patterns are needed to
195express by your programming language object system, which is impossible
196to express otherwise, because of some language limitations. It is very
197true for very static and not expressive languages like PHP or Java and
198less true for more expressive languages like Lisp and Haskell.
199
200Besides the basic principle of using OOP in your programming language of
201choice, you are going to need patterns to learn. The benefits of them
202are questionable, but it is not bad to know and they are being asked in
203interviews often.
204
205The best way to learn patterns is to use [[https://en.wikipedia.org/wiki/Smalltalk][Smalltalk]] and read the book
206[[https://en.wikipedia.org/wiki/Design_Patterns]["Gang of Four"]]. [[https://martinfowler.com/][Martin Fowler]] is a great source of enterprise-level
207patterns and notes about enterprise development in general. Also, there
208is a very useful website about design patterns with examples in many
209mainstream languages: https://refactoring.guru/
210
211[[[https://en.wikipedia.org/wiki/Object-oriented_programming][Wikipedia: OOP]]] | [[[https://en.wikipedia.org/wiki/Software_design_pattern][Wikipedia: Software design pattern]]]
212
213** Debugger
214You have a chance to work with others people's code, so you have a
215chance to get confused by a lot of stuff going on. Also, it is possible
216that you would make a mistake and will not understand what is going on,
217or where is an error. In that case, you will need a debugger. The
218debugger is usually part of your text editor environment and it is
219included in your programming environment alongside your interpreter /
220compiler. Some languages don't include a debugger, so you need to
221download it separately.
222
223The debugger allows you to step through your code and see the values of
224stack and heap, basically you get access to everything evaluated by your
225interpreter/compiler. It is very common practice to use such a thing
226when errors happen and I think that it is a great way to learn how your
227language of choice works internally.
228
229[[[https://en.wikipedia.org/wiki/Debugger][Wikipedia: Debugger]]]
230
231** Profiler
232A profiler is similar to a debugger, but it helps you to detect which
233part of your program is running slow, it also helps you detect memory
234leaks. Sometimes you or others write functions and do everything as
235intended, but it is running slow. To understand which part of your code
236is a bottleneck you need to run it in a profiler. Then profiler will
237show you a diagram with the execution time and memory consumption of
238your functions, which is helpful even when everything works fine.
239
240[[[https://en.wikipedia.org/wiki/Profiling_(computer_programming)][Wikipedia: Profiler]]]
241
242** Frontend
243If you are not exclusively backend developer, you will probably need to
244work with templates. Templates represent the outer view of your website,
245which represents backend's inner workings. Frontend part can be done
246using template engine or can be done as [[https://en.wikipedia.org/wiki/Single-page_application][Single Page Application]] with
247lots of client-side javascript coe.
248
249*** HTML
250HTML is used for representing your website information to your users. It
251contains only structural data and very basic formatting. If you see
252something that looks like an old document, that is probably plain HTML
253used.
254
255[[[https://en.wikipedia.org/wiki/Web_template_system][Wikipedia: Web Template System]]] | [[[https://en.wikipedia.org/wiki/Single-page_application][Wikipedia: Single-page Application]]]
256
257*** CSS
258CSS is being used for creating styling for your HTML pages. The role of
259CSS is to make your html layouts pretty, to make your buttons beautiful
260and the grid is clear. CSS frameworks help you to write less css by
261providing ready to use graphical elements such as buttons, menus, lists,
262grids, tables and so on. Often you don't need to know CSS so well, it is
263okay to know just a CSS framework.
264
265CSS Frameworks:
266- [[https://getbootstrap.com/][Twitter Bootstrap]]
267- [[https://fomantic-ui.com/][Fomantic UI]]
268- [[https://get.foundation/][Foundation]]
269- And many many others
270
271[[[https://en.wikipedia.org/wiki/CSS][Wikipedia: CSS]]]
272
273**** SASS/LESS
274CSS3 added some computing abilities introducing variables, calc and
275other features. Before that and because it lacked some other features
276for better css code reuse people have made CSS preprocessors. The point
277it to write css-like code that compiles to real css, so you write less
278things twice. SASS is being used in many css libraries such as Twitter
279bootstrap.
280
281*** Javascript
282Javascript is being used for creating interactivity with your HTML
283pages. If you see a dropdown menu, carousel, or slider, there is
284probably javascript involved. Javascript is a big and complex
285programming language, so you as a web developer will be required to know
286only a subset of it except if your main programming language is
287Javascript.
288
289If you work with SPA Application, you might be interested in learning:
290- [[https://reactjs.org/][React]]
291- [[https://vuejs.org/][Vue]]
292- [[https://angularjs.org/][Angular]]
293- [[https://emberjs.com/][Ember]]
294- probably other technologies
295
296Popular non-SPA library is [[https://jquery.com/][JQuery]] and plugins for it.
297
298[[[https://en.wikipedia.org/wiki/Javascript][Wikipedia: Javascript]]]
299
300*** Template engines
301Template engines are needed to transfer your backend data to your
302user. It provides a way to generate HTML with embedding variables and
303different functions for the developer's ease. The template engine is
304usually built-in in your framework of choice.
305
306[[[https://en.wikipedia.org/wiki/Template_processor][Wikipedia: Template Processor]]]
307
308** API
309There are standard ways to build APIs. If you are going to focus on that
310part of an application, only backend work, you should learn it.
311- [[https://en.wikipedia.org/wiki/Representational_state_transfer][RestAPI]]
312- [[https://jsonapi.org/][JSONAPI]]
313- [[https://en.wikipedia.org/wiki/GraphQL][GraphQL]]
314- [[https://en.wikipedia.org/wiki/SOAP][SOAP]]
315- and others
316
317The framework you use might provide a specific way for declaring
318APIs. For example, Symfony has [[https://api-platform.com/][API Platform]] and Django has [[https://www.django-rest-framework.org/][Django REST
319Framework]].
320
321[[[https://en.wikipedia.org/wiki/Web_API][Wikipedia: Web API]]]
322
323** Type hierarchy and standard library
324Every programming language has a standard library. The standard library
325is a library that comes together with your language, so you don't need
326to install any external dependencies to use it. Sometimes it is
327implicit, so you don't need to import anything, sometimes it is
328explicit, so you need to declare dependencies you use from the standard
329library.
330
331To learn more about your standard library, you should see your
332programming language documentation.
333
334[[[https://en.wikipedia.org/wiki/Standard_library][Wikipedia: Standard Library]]]
335
336** Package Manager
337It is hard to build something using only a standard library. Ideally you
338should try to use the standard library as much as you can, but it is
339very possible that the standard library will not include everything you
340would ever need. In such cases, you would use external software to get
341such software you can use package managers such as npm for nodejs, pip
342for python, composer for php, maven for java and gem for ruby.
343
344Such package manager can be installed together with your programming
345language interpreter or can be installed externally. Check package
346manager documentation about its installation.
347
348It is important to know the basics of how they work in general. The
349topic of dependency resolution is hard, but for end-users, it should be
350quite easy to work.
351
352[[[https://en.wikipedia.org/wiki/Package_manager][Wikipedia: Package
353Manager]]]
354
355** Version Manager
356If you don't use docker all the way, sometimes you will need to change
357your interpreter version depending on the project you use. To change
358let's say nodejs 18 to nodejs 16, you will need something called version
359manager, for that particular case you will need NVM (Node Version
360Manager). Such version managers exist for many languages (RVM, Pyenv,
361Jenv and so on).
362
363** Version Control
364You should always use version control system even if you work completely
365alone. Version control allows you to work with other people and check
366changes over your codebase over time. This is essential technology to
367know for development these days, at least if we talk about hired work as
368web developer.
369
370Version Control Systems:
371- Git
372- Mercurial
373- Darcs
374- Bazaar
375- Subversion
376- RCS
377- CVS
378- and others
379
380Git is popular version control system and you probably will use it or
381already using it.
382
383To learn what is it all about you can watch
384[[https://www.youtube.com/watch?v=92sycL8ij-U][a short series of videos
385about git from computerphile]].
386
387[[https://git-scm.com/book/en/v2][Book called "Pro Git"]] can help you to learn Git in more depth.
388
389[[[https://en.wikipedia.org/wiki/Version_control][Wikipedia: Version Control]]]
390
391** Framework or(and) set of libraries
392Every job sticks to its own stack. Very often it sticks to one specific
393web framework, that you are required to learn. It can be something like
394Django, Symfony, Spring, Ruby on Rails, or others.
395
396Frameworks are usually the biggest part of your codebase. The difference
397between framework and library: Framework runs your code with your
398classes, but libraries are being used by you explicitly and you execute
399all the code from them. The concept of reverting control over the code
400to your framework is called [[https://en.wikipedia.org/wiki/Inversion_of_control][Inversion of Control]].
401
402To learn your framework of choice you should read its documentation. If
403documentation is bad then I would recommend not using it. Sometimes
404framework developers sell additional courses or books on using their
405product (IMO it's bad).
406
407** Programming language
408And the last but very important item on our list is the programming
409language itself. You should know it, you should know it well. To
410distinguish that item from the standard library I should point out that
411programming language consists of its syntax, semantics and in general it
412is every fundamental language block that is not described in that
413language itself (an example is the standard library).
414
415Mostly it is easy to understand your programming language since most of
416 it is a standard library. Many fundamental concepts of programming
417 languages come from programming in general. So you can read a book or
418 learn different programming languages by documentation and there is a
419 huge chance that concepts from them can be applied to many languages,
420 not just one.
421
422It is a good idea to learn programming, complexity with big O notation,
423data structures, algorithms, compiler/interpreter construction and so
424on. But it is not so required in actual day-to-day work, especially for
425web development. You can argue about this, but I would say that this is
426mostly true for many types of work since many libraries and SQL
427databases manage complexity on their own, all you need to declare your
428classes and don't make them leak memory that much.
429
430[[[https://en.wikipedia.org/wiki/Computer_programming][Wikipedia: Programming]]] | [[[https://en.wikipedia.org/wiki/Programming_language][Wikipedia: Programming language]]] |
431[[[https://en.wikipedia.org/wiki/Computer_science][Wikipedia: Computer Science]]]
432
433* Most popular programming languages
434Your choices are quite limited here. More jobs available, more chances
435to get that job. There will be different results in different areas. I
436think that in most areas you will have a choice between Java, Python,
437and maybe PHP or Ruby. If you want to end up insane, there is also
438Javascript, but it is not as mature for the backend as other
439technologies (it is my biased opinion), so I will not include it (there
440is only a "big" framework called NestJS and the demand for it is
441probably low).
442
443** Java / C#
444Probably the most popular programming languages out there especially
445when it comes to working at companies. It is statically typed and quite
446easy to learn languages. They are restricted to OOP the most, so you
447probably will use oop design patterns here more than in other
448programming languages. The type system is not as advanced as in ML
449dialects and actually, it is unsound as in other mainstream languages,
450but it provides some merits of safety compared to nonsafe C or weak
451typed languages such as PHP and Javascript.
452
453Frameworks:
454- [[https://spring.io/projects/spring-framework][Spring]]
455- [[https://dotnet.microsoft.com/en-us/][.Net]]
456
457ORM:
458- [[https://hibernate.org/orm/][Hibernate]]
459
460[[[https://learn.microsoft.com/en-us/dotnet/csharp/][C# Documentation]]] | [[[https://docs.oracle.com/javase/tutorial/][Java Documentation]]]
461
462** Python
463Second the most popular programming language. It differs from Java a
464lot. It is dynamically typed, strongly typed and more object oriented
465than Java (everything is an object), but somehow manages to look like a
466procedural code, it forces you to indent your code right.
467
468I like Python more than other mainstream languages, it does many things
469right. I like that Python while being a fully object-oriented language
470doesn't drop to dogmatic believing in OOP patterns. It also has good
471[[https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop][REPL]] and [[https://en.wikipedia.org/wiki/Reflective_programming][reflection]]/[[https://en.wikipedia.org/wiki/Introspection][introspection]] abilities without writing much code
472like in Java or PHP.
473
474Frameworks:
475- [[https://djangoproject.com/][Django]]
476- [[https://palletsprojects.com/p/flask/][Flask]]
477- [[https://fastapi.tiangolo.com/][FastAPI]]
478- [[https://trypyramid.com/][Pyramid]]
479
480ORM:
481- Django ORM (Active Record)
482- [[https://www.sqlalchemy.org/][SQLAlchemy]] (Data Mapper)
483
484Learning resources:
485- [[https://www.python.org/doc/][Python Documentation]]
486- [[https://realpython.com/][Real Python]]
487- [[https://www.fullstackpython.com/][Fullstack Python]]
488
489** PHP
490PHP might be unpopular in some areas, but it is quite popular in
491Russia. It runs lots of small businesses and it is probably the easiest
492tech stack to get a job (but not the easiest language to work with). The
493language has lots of caveats such as weak typing, unorganized standard
494library, less developed OOP and types checking, lots of procedural PHP
495legacy, and most built-in functions of the language are defined in C. My
496observation is that PHP has the worst error messages compared to other
497high-level languages. Despite this PHP is overall not so bad with newer
498versions and it tries to remove legacy that has made the reputation of
499PHP extremely bad in programming circles.
500
501Frameworks:
502- [[https://symfony.com/][Symfony]]
503- [[https://laravel.com/][Laravel]]
504
505ORM:
506- [[https://www.doctrine-project.org/][Doctrine]]
507
508Learning resources:
509- [[https://www.php.net/docs.php][PHP documentation]]
510- [[https://symfonycasts.com/][Symfonycast (paid)]]
511
512* Less popular programming language
513** Go
514Go is compiled statically typed procedural language made by creators of
515C. It has garbage collection as interpreted languages. It has a rich
516standard library and as I understand used mostly for DevOps or
517microservices and less used for building monolithic applications as in
518other programming languages. It also has strong abilities to do parallel
519computations. Language doesn't have REPL and strong
520reflection/introspection abilities.
521
522Learning resources:
523- [[https://go.dev/][GO documentation]]
524
525** Ruby
526Ruby is mostly used for web development, because of the popularity of
527the Ruby on Rails framework. The demand for it might be low in some
528areas, so investigate your market yourself before learning it. Ruby is
529strongly typed object-oriented in [[https://en.wikipedia.org/wiki/Smalltalk][Smalltalk sense]] language. It has mixed
530Lisp, Perl and Smalltalk roots. It has very powerful REPL,
531reflection/introspection abilities, probably the best after LISPs and
532Smalltalk. The biggest downside of the language is the lack of good
533documentation on Ruby website.
534
535Frameworks:
536- [[https://rubyonrails.org/][Ruby on Rails]]
537- [[https://sinatrarb.com/][Sinatra]]
538
539ORM:
540- [[https://guides.rubyonrails.org/active_record_basics.html][Active Record]]
541- [[https://en.wikipedia.org/wiki/DataMapper][DataMapper]]
542
543Learning resources:
544- [[https://poignant.guide/][why's (poignant) Guide to Ruby]]
545- [[https://ruby-doc.org/docs/ruby-doc-bundle/ProgrammingRuby/book/language.html][Programming Ruby Book]]
546- [[https://www.ruby-lang.org/en/][Ruby Website]]
547
548* Harder to find a work languages
549- Scala
550- Haskell
551- Erlang
552- Clojure
553- Rust
554
555- (C/C++) since they are not suitable for web development
556
557* Almost impossible to find a work languages
558- Any LISP
559- SML
560- Other powerful functional programming languages such as Agda, COQ and
561 so on
562
563* How to get good
564First of all, restrict yourself and don't buy any paid courses or
565workshops, most information is available for free for everyone. Just
566read the Wikipedia links I provided in the article and follow the links
567there to the official documentation of the thing you want to learn.
568
569When it comes to programming in general I recommend learning it by doing
570test projects or just playing with the code. You can also use services
571like [[https://exercism.org/][Exercism]] or [[https://codewars.com/][Codewars]] to practice pure programming solving
572problems. Also, there is a great web resource for complete beginners
573called [[https://freecodecamp.org/][FreeCodeCamp]], which covers the basics of web development and
574Javascript programming.
575
576Also, I recommend reading old academic books on programming, because
577many concepts are the same in many programming languages, what you need
578is the ability to think abstractly using data structures and
579algorithms. I recommend anyone who wants to grok programming to read:
580- [[https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs][SICP]]
581- [[https://en.wikipedia.org/wiki/How_to_Design_Programs][HTDP]]
582- [[https://www.cis.upenn.edu/~bcpierce/tapl/][TAPL]]
583- [[https://en.wikipedia.org/wiki/Essentials_of_Programming_Languages][Essentials Of Programming Languages]]
584- [[https://en.wikipedia.org/wiki/Niklaus_Wirth][Niklaus Wirth]] books, [[https://en.wikipedia.org/wiki/Edsger_W._Dijkstra][Dijkstra]]'s articles
585- [[https://download-mirror.savannah.gnu.org/releases/pgubook/ProgrammingGroundUp-1-0-booksize.pdf][Programming from the ground up]] or [[http://stolyarov.info/books][Stolyrov's series of books [Ru]​]]
586- Also see [[https://www.gnu.org/doc/other-free-books.html][free books from GNU website]]
587
588The rule of thumb is that if the book has a Wikipedia article, it is
589probably a good book and you should read it/. There are tons of free for
590everyone materials about programming on the Internet, so of course, you
591should not be limited to the list above.
592
593There are many free sources to learn you just need to invest your time
594into them. The downside of learning LISP (or let's say SML and Haskell
595or other nonpopular in the industry mostly academic languages) is that
596mainstream programming on your job can feel very restrictive and less
597expressive. Also, you will probably learn that many mainstream languages
598have lots of quirks or bad design decisions.
599
600* Conclusion
601It is also possible to get a job with a less popular stack, but if you
602are just starting it might be reasonable to focus on the popular one
603first. The list of technologies is quite big, so newbies can be lost in
604new information. Be patient and learn one thing at a time. I would
605recommend starting with programming language documentation, then SQL,
606and then going to the docs of your web framework/library.
607
608Demand for web developers is huge and in my opinion, it is the easiest
609way to get a job if you are just starting even tho it has a lot of
610downsides too, but that's a topic for another article.
611
612* Errata
613- *<2022-10-14 Fri>* Typos are fixed, sentences have been
614 rephrased. Thanks to Andre Gomes for proof-reading and editing.
Note: See TracBrowser for help on using the repository browser.