1 | #+TITLE: Technologies of web development
|
---|
2 | #+DATE: <2022-10-11 Tue>
|
---|
3 | #+LANGUAGE: en
|
---|
4 |
|
---|
5 | * Technologies of web development
|
---|
6 | #+BEGIN_abstract
|
---|
7 | In this article I shall categorize languages, frameworks, libraries and
|
---|
8 | software by a criteria of usage such technologies at hired work. Be
|
---|
9 | aware that opinions expressed in the article might be biased and
|
---|
10 | irrational.
|
---|
11 | #+END_abstract
|
---|
12 |
|
---|
13 | I work in the IT field as a web developer for many years, but cannot
|
---|
14 | proudly claim myself as a professional. I don't know many things, I
|
---|
15 | don't like corporate IT culture and I don't particularly like web
|
---|
16 | development. Still I have an experience in the field, and it is much
|
---|
17 | easier to dive into web development to earn money for a living than to
|
---|
18 | devote my time to other professions at my location. I hope this text
|
---|
19 | will be useful for someone who is outside of the field of web
|
---|
20 | development to get a grasp which technologies to learn.
|
---|
21 |
|
---|
22 | * What is tech stack
|
---|
23 | #+BEGIN_abstract
|
---|
24 | A tech stack is a the mix of technologies (software, frameworks,
|
---|
25 | libraries) that the projects use to implement a planned set of features.
|
---|
26 | #+END_abstract
|
---|
27 |
|
---|
28 | Knowing everything from your tech stack is not the only key to
|
---|
29 | success. It can sound obvious, but social skills can play a more
|
---|
30 | important role than your programming skills. Programming is a social
|
---|
31 | activity as most of what, everything you are going to use is built by
|
---|
32 | other people. Sometimes things break and you need to contact them. It is
|
---|
33 | also important to communicate well with your company's team to avoid
|
---|
34 | conflicts. And don't be that guy (me!), who hates something and gets
|
---|
35 | verbal about it in such a way. This doesn't help you in any way. It can
|
---|
36 | be seen as a suppression of your ego, but the truth is that hired work
|
---|
37 | is more about collectivism than individualism.
|
---|
38 |
|
---|
39 | Next, I present the list of technologies you should be comfortable with
|
---|
40 | to work as a web developer. The list is not mandatory and you are not
|
---|
41 | required to learn it on an expert level to get your job offer.
|
---|
42 |
|
---|
43 | * Technologies to learn
|
---|
44 | Some things you will use in most of your projects, so you are better to
|
---|
45 | familiarize yourself with them anyway. What I've discovered, is that
|
---|
46 | most knowledge of some tech is transferable to other techs. For example,
|
---|
47 | learning one web-framework helps you to learn others.
|
---|
48 |
|
---|
49 | ** Text Editor
|
---|
50 | Not sure if I need to write it, but you need a development environment
|
---|
51 | where 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 |
|
---|
63 | Proprietary means that source code is not available and probably it
|
---|
64 | costs money, so you, as a user, don't have control over it. You can
|
---|
65 | learn more why it is important on the [[https://gnu.org/philosophy/][GNU website]]. Such an important
|
---|
66 | tool 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
|
---|
69 | environment]]]
|
---|
70 |
|
---|
71 | ** SQL
|
---|
72 | Or it should be called persistence, but mostly you will use something
|
---|
73 | like [[https://www.postgresql.org/][Postgres]] or [[https://mariadb.com/kb/en/][MariaDB]]/[[https://mysql.com/][MySQL]]. Rarely it can be NoSQL like MongoDB.
|
---|
74 |
|
---|
75 | The database is the main thing around which you will develop your
|
---|
76 | application. I would say that the code is secondary compared to the data
|
---|
77 | you store and get from the database, so it is an extremely good idea to
|
---|
78 | learn SQL well, especially in the long run. For the start, it is okay to
|
---|
79 | know a little and get going along the way because you will probably work
|
---|
80 | with SQL through ORM.
|
---|
81 |
|
---|
82 | I recommend using [[https://dbeaver.io/][Dbeaver]] as IDE for running SQL-related code. It eases
|
---|
83 | the 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
|
---|
88 | Each tech stack provides ORM. ORM allows you to operate your database
|
---|
89 | "objects" as your programming language code without writing or
|
---|
90 | minimizing writing raw SQL. It is quite rare when you need to work with
|
---|
91 | pure SQL or the project doesn't use ORM at all. ORMs might be something
|
---|
92 | from 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
|
---|
103 | Most databases use hard drives to store data, but some data needs to be
|
---|
104 | stored in RAM for better performance. For that cases you need to learn
|
---|
105 | about 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
|
---|
112 | You don't need to know everything from the start, but since you are
|
---|
113 | going to work as a web dev you need to know what you are using. It is
|
---|
114 | essential if you do backend APIs.
|
---|
115 |
|
---|
116 | The 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
|
---|
117 | you work with Java, HTTP servers can be written in Java such as [[https://en.wikipedia.org/wiki/Jetty_(web_server)][Jetty]]
|
---|
118 | and others.
|
---|
119 |
|
---|
120 | I recommend reading [[https://amazon.com/HTTP-Definitive-Guide-Guides/dp/1565925092][a book called "HTTP: The Definitive Guide: The
|
---|
121 | Definitive 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
|
---|
126 | You might need searching functionality. It is okay to include google
|
---|
127 | search in basic cases, but it is not an acceptable choice in many
|
---|
128 | cases. To search like google does you will need full-text search
|
---|
129 | engines. 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
|
---|
135 | RabbitMQ, ZeroMQ, Kafka and others. You need those to create queues and
|
---|
136 | other stuff that needs to be delayed. It is used because some languages
|
---|
137 | have 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
|
---|
142 | You will probably work on Linux, variants of BSD systems, or macs. You
|
---|
143 | need to familiarize with the system you use as different tasks require
|
---|
144 | different degrees of that skill, but knowledge of what you are using
|
---|
145 | every day will be handy.
|
---|
146 |
|
---|
147 | There are many ways to learn it, but I recommend trying to install it on
|
---|
148 | your 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
|
---|
151 | are will be present in your filesystem so you can read them by jumping
|
---|
152 | into /usr/share/docs folder or running ~info~ and ~man~ commands. I
|
---|
153 | recommend reading it and exploring the Debian website. Also for learning
|
---|
154 | Linux, Arch Linux wiki is a good source of knowledge (Slackware and
|
---|
155 | Gentoo 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
|
---|
160 | Your team probably will use docker for deployment or development (or
|
---|
161 | both). You might want to get your project working in a container for
|
---|
162 | better accessibility by your team. The point of docker as a development
|
---|
163 | tool is to let your team quickly get the same environment as you. The
|
---|
164 | point of docker as a deployment tool is to deploy the same environment
|
---|
165 | that you develop in. It is important to have a reproducible production
|
---|
166 | environment because catching bugs in 3 different environments (dev,
|
---|
167 | staging, prod) sucks.
|
---|
168 |
|
---|
169 | [[[https://en.wikipedia.org/wiki/Docker_(software)][Wikipedia: Docker]]]
|
---|
170 |
|
---|
171 | ** CI/CD and Deployment
|
---|
172 | You need to be able to deploy your application to the production
|
---|
173 | server. Good practice is to use a CI/CD pipeline. The CI/CD pipeline
|
---|
174 | runs checks of your project in a docker container and when the tests are
|
---|
175 | successful, the code deploys to production.
|
---|
176 |
|
---|
177 | There is also an old approach with logging into your server via a small
|
---|
178 | script by ssh and then deploying everything as you just move files
|
---|
179 | manually.
|
---|
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
|
---|
187 | You will be probably forced to use OOP techniques in corporate IT
|
---|
188 | culture. It is not something that improves development that much, but it
|
---|
189 | is a very common way to organize codebase and it is kind of great for
|
---|
190 | working 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
|
---|
192 | computer science than OOP.
|
---|
193 |
|
---|
194 | Not everyone will agree with my definition, but patterns are needed to
|
---|
195 | express by your programming language object system, which is impossible
|
---|
196 | to express otherwise, because of some language limitations. It is very
|
---|
197 | true for very static and not expressive languages like PHP or Java and
|
---|
198 | less true for more expressive languages like Lisp and Haskell.
|
---|
199 |
|
---|
200 | Besides the basic principle of using OOP in your programming language of
|
---|
201 | choice, you are going to need patterns to learn. The benefits of them
|
---|
202 | are questionable, but it is not bad to know and they are being asked in
|
---|
203 | interviews often.
|
---|
204 |
|
---|
205 | The 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
|
---|
207 | patterns and notes about enterprise development in general. Also, there
|
---|
208 | is a very useful website about design patterns with examples in many
|
---|
209 | mainstream 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
|
---|
214 | You have a chance to work with others people's code, so you have a
|
---|
215 | chance to get confused by a lot of stuff going on. Also, it is possible
|
---|
216 | that you would make a mistake and will not understand what is going on,
|
---|
217 | or where is an error. In that case, you will need a debugger. The
|
---|
218 | debugger is usually part of your text editor environment and it is
|
---|
219 | included in your programming environment alongside your interpreter /
|
---|
220 | compiler. Some languages don't include a debugger, so you need to
|
---|
221 | download it separately.
|
---|
222 |
|
---|
223 | The debugger allows you to step through your code and see the values of
|
---|
224 | stack and heap, basically you get access to everything evaluated by your
|
---|
225 | interpreter/compiler. It is very common practice to use such a thing
|
---|
226 | when errors happen and I think that it is a great way to learn how your
|
---|
227 | language of choice works internally.
|
---|
228 |
|
---|
229 | [[[https://en.wikipedia.org/wiki/Debugger][Wikipedia: Debugger]]]
|
---|
230 |
|
---|
231 | ** Profiler
|
---|
232 | A profiler is similar to a debugger, but it helps you to detect which
|
---|
233 | part of your program is running slow, it also helps you detect memory
|
---|
234 | leaks. Sometimes you or others write functions and do everything as
|
---|
235 | intended, but it is running slow. To understand which part of your code
|
---|
236 | is a bottleneck you need to run it in a profiler. Then profiler will
|
---|
237 | show you a diagram with the execution time and memory consumption of
|
---|
238 | your functions, which is helpful even when everything works fine.
|
---|
239 |
|
---|
240 | [[[https://en.wikipedia.org/wiki/Profiling_(computer_programming)][Wikipedia: Profiler]]]
|
---|
241 |
|
---|
242 | ** Frontend
|
---|
243 | If you are not exclusively backend developer, you will probably need to
|
---|
244 | work with templates. Templates represent the outer view of your website,
|
---|
245 | which represents backend's inner workings. Frontend part can be done
|
---|
246 | using template engine or can be done as [[https://en.wikipedia.org/wiki/Single-page_application][Single Page Application]] with
|
---|
247 | lots of client-side javascript coe.
|
---|
248 |
|
---|
249 | *** HTML
|
---|
250 | HTML is used for representing your website information to your users. It
|
---|
251 | contains only structural data and very basic formatting. If you see
|
---|
252 | something that looks like an old document, that is probably plain HTML
|
---|
253 | used.
|
---|
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
|
---|
258 | CSS is being used for creating styling for your HTML pages. The role of
|
---|
259 | CSS is to make your html layouts pretty, to make your buttons beautiful
|
---|
260 | and the grid is clear. CSS frameworks help you to write less css by
|
---|
261 | providing ready to use graphical elements such as buttons, menus, lists,
|
---|
262 | grids, tables and so on. Often you don't need to know CSS so well, it is
|
---|
263 | okay to know just a CSS framework.
|
---|
264 |
|
---|
265 | CSS 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
|
---|
274 | CSS3 added some computing abilities introducing variables, calc and
|
---|
275 | other features. Before that and because it lacked some other features
|
---|
276 | for better css code reuse people have made CSS preprocessors. The point
|
---|
277 | it to write css-like code that compiles to real css, so you write less
|
---|
278 | things twice. SASS is being used in many css libraries such as Twitter
|
---|
279 | bootstrap.
|
---|
280 |
|
---|
281 | *** Javascript
|
---|
282 | Javascript is being used for creating interactivity with your HTML
|
---|
283 | pages. If you see a dropdown menu, carousel, or slider, there is
|
---|
284 | probably javascript involved. Javascript is a big and complex
|
---|
285 | programming language, so you as a web developer will be required to know
|
---|
286 | only a subset of it except if your main programming language is
|
---|
287 | Javascript.
|
---|
288 |
|
---|
289 | If 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 |
|
---|
296 | Popular 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
|
---|
301 | Template engines are needed to transfer your backend data to your
|
---|
302 | user. It provides a way to generate HTML with embedding variables and
|
---|
303 | different functions for the developer's ease. The template engine is
|
---|
304 | usually built-in in your framework of choice.
|
---|
305 |
|
---|
306 | [[[https://en.wikipedia.org/wiki/Template_processor][Wikipedia: Template Processor]]]
|
---|
307 |
|
---|
308 | ** API
|
---|
309 | There are standard ways to build APIs. If you are going to focus on that
|
---|
310 | part 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 |
|
---|
317 | The framework you use might provide a specific way for declaring
|
---|
318 | APIs. For example, Symfony has [[https://api-platform.com/][API Platform]] and Django has [[https://www.django-rest-framework.org/][Django REST
|
---|
319 | Framework]].
|
---|
320 |
|
---|
321 | [[[https://en.wikipedia.org/wiki/Web_API][Wikipedia: Web API]]]
|
---|
322 |
|
---|
323 | ** Type hierarchy and standard library
|
---|
324 | Every programming language has a standard library. The standard library
|
---|
325 | is a library that comes together with your language, so you don't need
|
---|
326 | to install any external dependencies to use it. Sometimes it is
|
---|
327 | implicit, so you don't need to import anything, sometimes it is
|
---|
328 | explicit, so you need to declare dependencies you use from the standard
|
---|
329 | library.
|
---|
330 |
|
---|
331 | To learn more about your standard library, you should see your
|
---|
332 | programming language documentation.
|
---|
333 |
|
---|
334 | [[[https://en.wikipedia.org/wiki/Standard_library][Wikipedia: Standard Library]]]
|
---|
335 |
|
---|
336 | ** Package Manager
|
---|
337 | It is hard to build something using only a standard library. Ideally you
|
---|
338 | should try to use the standard library as much as you can, but it is
|
---|
339 | very possible that the standard library will not include everything you
|
---|
340 | would ever need. In such cases, you would use external software to get
|
---|
341 | such software you can use package managers such as npm for nodejs, pip
|
---|
342 | for python, composer for php, maven for java and gem for ruby.
|
---|
343 |
|
---|
344 | Such package manager can be installed together with your programming
|
---|
345 | language interpreter or can be installed externally. Check package
|
---|
346 | manager documentation about its installation.
|
---|
347 |
|
---|
348 | It is important to know the basics of how they work in general. The
|
---|
349 | topic of dependency resolution is hard, but for end-users, it should be
|
---|
350 | quite easy to work.
|
---|
351 |
|
---|
352 | [[[https://en.wikipedia.org/wiki/Package_manager][Wikipedia: Package
|
---|
353 | Manager]]]
|
---|
354 |
|
---|
355 | ** Version Manager
|
---|
356 | If you don't use docker all the way, sometimes you will need to change
|
---|
357 | your interpreter version depending on the project you use. To change
|
---|
358 | let's say nodejs 18 to nodejs 16, you will need something called version
|
---|
359 | manager, for that particular case you will need NVM (Node Version
|
---|
360 | Manager). Such version managers exist for many languages (RVM, Pyenv,
|
---|
361 | Jenv and so on).
|
---|
362 |
|
---|
363 | ** Version Control
|
---|
364 | You should always use version control system even if you work completely
|
---|
365 | alone. Version control allows you to work with other people and check
|
---|
366 | changes over your codebase over time. This is essential technology to
|
---|
367 | know for development these days, at least if we talk about hired work as
|
---|
368 | web developer.
|
---|
369 |
|
---|
370 | Version Control Systems:
|
---|
371 | - Git
|
---|
372 | - Mercurial
|
---|
373 | - Darcs
|
---|
374 | - Bazaar
|
---|
375 | - Subversion
|
---|
376 | - RCS
|
---|
377 | - CVS
|
---|
378 | - and others
|
---|
379 |
|
---|
380 | Git is popular version control system and you probably will use it or
|
---|
381 | already using it.
|
---|
382 |
|
---|
383 | To learn what is it all about you can watch
|
---|
384 | [[https://www.youtube.com/watch?v=92sycL8ij-U][a short series of videos
|
---|
385 | about 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
|
---|
392 | Every job sticks to its own stack. Very often it sticks to one specific
|
---|
393 | web framework, that you are required to learn. It can be something like
|
---|
394 | Django, Symfony, Spring, Ruby on Rails, or others.
|
---|
395 |
|
---|
396 | Frameworks are usually the biggest part of your codebase. The difference
|
---|
397 | between framework and library: Framework runs your code with your
|
---|
398 | classes, but libraries are being used by you explicitly and you execute
|
---|
399 | all the code from them. The concept of reverting control over the code
|
---|
400 | to your framework is called [[https://en.wikipedia.org/wiki/Inversion_of_control][Inversion of Control]].
|
---|
401 |
|
---|
402 | To learn your framework of choice you should read its documentation. If
|
---|
403 | documentation is bad then I would recommend not using it. Sometimes
|
---|
404 | framework developers sell additional courses or books on using their
|
---|
405 | product (IMO it's bad).
|
---|
406 |
|
---|
407 | ** Programming language
|
---|
408 | And the last but very important item on our list is the programming
|
---|
409 | language itself. You should know it, you should know it well. To
|
---|
410 | distinguish that item from the standard library I should point out that
|
---|
411 | programming language consists of its syntax, semantics and in general it
|
---|
412 | is every fundamental language block that is not described in that
|
---|
413 | language itself (an example is the standard library).
|
---|
414 |
|
---|
415 | Mostly 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 |
|
---|
422 | It is a good idea to learn programming, complexity with big O notation,
|
---|
423 | data structures, algorithms, compiler/interpreter construction and so
|
---|
424 | on. But it is not so required in actual day-to-day work, especially for
|
---|
425 | web development. You can argue about this, but I would say that this is
|
---|
426 | mostly true for many types of work since many libraries and SQL
|
---|
427 | databases manage complexity on their own, all you need to declare your
|
---|
428 | classes 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
|
---|
434 | Your choices are quite limited here. More jobs available, more chances
|
---|
435 | to get that job. There will be different results in different areas. I
|
---|
436 | think that in most areas you will have a choice between Java, Python,
|
---|
437 | and maybe PHP or Ruby. If you want to end up insane, there is also
|
---|
438 | Javascript, but it is not as mature for the backend as other
|
---|
439 | technologies (it is my biased opinion), so I will not include it (there
|
---|
440 | is only a "big" framework called NestJS and the demand for it is
|
---|
441 | probably low).
|
---|
442 |
|
---|
443 | ** Java / C#
|
---|
444 | Probably the most popular programming languages out there especially
|
---|
445 | when it comes to working at companies. It is statically typed and quite
|
---|
446 | easy to learn languages. They are restricted to OOP the most, so you
|
---|
447 | probably will use oop design patterns here more than in other
|
---|
448 | programming languages. The type system is not as advanced as in ML
|
---|
449 | dialects and actually, it is unsound as in other mainstream languages,
|
---|
450 | but it provides some merits of safety compared to nonsafe C or weak
|
---|
451 | typed languages such as PHP and Javascript.
|
---|
452 |
|
---|
453 | Frameworks:
|
---|
454 | - [[https://spring.io/projects/spring-framework][Spring]]
|
---|
455 | - [[https://dotnet.microsoft.com/en-us/][.Net]]
|
---|
456 |
|
---|
457 | ORM:
|
---|
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
|
---|
463 | Second the most popular programming language. It differs from Java a
|
---|
464 | lot. It is dynamically typed, strongly typed and more object oriented
|
---|
465 | than Java (everything is an object), but somehow manages to look like a
|
---|
466 | procedural code, it forces you to indent your code right.
|
---|
467 |
|
---|
468 | I like Python more than other mainstream languages, it does many things
|
---|
469 | right. I like that Python while being a fully object-oriented language
|
---|
470 | doesn'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
|
---|
472 | like in Java or PHP.
|
---|
473 |
|
---|
474 | Frameworks:
|
---|
475 | - [[https://djangoproject.com/][Django]]
|
---|
476 | - [[https://palletsprojects.com/p/flask/][Flask]]
|
---|
477 | - [[https://fastapi.tiangolo.com/][FastAPI]]
|
---|
478 | - [[https://trypyramid.com/][Pyramid]]
|
---|
479 |
|
---|
480 | ORM:
|
---|
481 | - Django ORM (Active Record)
|
---|
482 | - [[https://www.sqlalchemy.org/][SQLAlchemy]] (Data Mapper)
|
---|
483 |
|
---|
484 | Learning 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
|
---|
490 | PHP might be unpopular in some areas, but it is quite popular in
|
---|
491 | Russia. It runs lots of small businesses and it is probably the easiest
|
---|
492 | tech stack to get a job (but not the easiest language to work with). The
|
---|
493 | language has lots of caveats such as weak typing, unorganized standard
|
---|
494 | library, less developed OOP and types checking, lots of procedural PHP
|
---|
495 | legacy, and most built-in functions of the language are defined in C. My
|
---|
496 | observation is that PHP has the worst error messages compared to other
|
---|
497 | high-level languages. Despite this PHP is overall not so bad with newer
|
---|
498 | versions and it tries to remove legacy that has made the reputation of
|
---|
499 | PHP extremely bad in programming circles.
|
---|
500 |
|
---|
501 | Frameworks:
|
---|
502 | - [[https://symfony.com/][Symfony]]
|
---|
503 | - [[https://laravel.com/][Laravel]]
|
---|
504 |
|
---|
505 | ORM:
|
---|
506 | - [[https://www.doctrine-project.org/][Doctrine]]
|
---|
507 |
|
---|
508 | Learning resources:
|
---|
509 | - [[https://www.php.net/docs.php][PHP documentation]]
|
---|
510 | - [[https://symfonycasts.com/][Symfonycast (paid)]]
|
---|
511 |
|
---|
512 | * Less popular programming language
|
---|
513 | ** Go
|
---|
514 | Go is compiled statically typed procedural language made by creators of
|
---|
515 | C. It has garbage collection as interpreted languages. It has a rich
|
---|
516 | standard library and as I understand used mostly for DevOps or
|
---|
517 | microservices and less used for building monolithic applications as in
|
---|
518 | other programming languages. It also has strong abilities to do parallel
|
---|
519 | computations. Language doesn't have REPL and strong
|
---|
520 | reflection/introspection abilities.
|
---|
521 |
|
---|
522 | Learning resources:
|
---|
523 | - [[https://go.dev/][GO documentation]]
|
---|
524 |
|
---|
525 | ** Ruby
|
---|
526 | Ruby is mostly used for web development, because of the popularity of
|
---|
527 | the Ruby on Rails framework. The demand for it might be low in some
|
---|
528 | areas, so investigate your market yourself before learning it. Ruby is
|
---|
529 | strongly typed object-oriented in [[https://en.wikipedia.org/wiki/Smalltalk][Smalltalk sense]] language. It has mixed
|
---|
530 | Lisp, Perl and Smalltalk roots. It has very powerful REPL,
|
---|
531 | reflection/introspection abilities, probably the best after LISPs and
|
---|
532 | Smalltalk. The biggest downside of the language is the lack of good
|
---|
533 | documentation on Ruby website.
|
---|
534 |
|
---|
535 | Frameworks:
|
---|
536 | - [[https://rubyonrails.org/][Ruby on Rails]]
|
---|
537 | - [[https://sinatrarb.com/][Sinatra]]
|
---|
538 |
|
---|
539 | ORM:
|
---|
540 | - [[https://guides.rubyonrails.org/active_record_basics.html][Active Record]]
|
---|
541 | - [[https://en.wikipedia.org/wiki/DataMapper][DataMapper]]
|
---|
542 |
|
---|
543 | Learning 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
|
---|
564 | First of all, restrict yourself and don't buy any paid courses or
|
---|
565 | workshops, most information is available for free for everyone. Just
|
---|
566 | read the Wikipedia links I provided in the article and follow the links
|
---|
567 | there to the official documentation of the thing you want to learn.
|
---|
568 |
|
---|
569 | When it comes to programming in general I recommend learning it by doing
|
---|
570 | test projects or just playing with the code. You can also use services
|
---|
571 | like [[https://exercism.org/][Exercism]] or [[https://codewars.com/][Codewars]] to practice pure programming solving
|
---|
572 | problems. Also, there is a great web resource for complete beginners
|
---|
573 | called [[https://freecodecamp.org/][FreeCodeCamp]], which covers the basics of web development and
|
---|
574 | Javascript programming.
|
---|
575 |
|
---|
576 | Also, I recommend reading old academic books on programming, because
|
---|
577 | many concepts are the same in many programming languages, what you need
|
---|
578 | is the ability to think abstractly using data structures and
|
---|
579 | algorithms. 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 |
|
---|
588 | The rule of thumb is that if the book has a Wikipedia article, it is
|
---|
589 | probably a good book and you should read it/. There are tons of free for
|
---|
590 | everyone materials about programming on the Internet, so of course, you
|
---|
591 | should not be limited to the list above.
|
---|
592 |
|
---|
593 | There are many free sources to learn you just need to invest your time
|
---|
594 | into them. The downside of learning LISP (or let's say SML and Haskell
|
---|
595 | or other nonpopular in the industry mostly academic languages) is that
|
---|
596 | mainstream programming on your job can feel very restrictive and less
|
---|
597 | expressive. Also, you will probably learn that many mainstream languages
|
---|
598 | have lots of quirks or bad design decisions.
|
---|
599 |
|
---|
600 | * Conclusion
|
---|
601 | It is also possible to get a job with a less popular stack, but if you
|
---|
602 | are just starting it might be reasonable to focus on the popular one
|
---|
603 | first. The list of technologies is quite big, so newbies can be lost in
|
---|
604 | new information. Be patient and learn one thing at a time. I would
|
---|
605 | recommend starting with programming language documentation, then SQL,
|
---|
606 | and then going to the docs of your web framework/library.
|
---|
607 |
|
---|
608 | Demand for web developers is huge and in my opinion, it is the easiest
|
---|
609 | way to get a job if you are just starting even tho it has a lot of
|
---|
610 | downsides 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.
|
---|