<p>Firstly, html/css are not programming languages though they are languages.
Javascript is a programming language but JS/Web is far from being the best entry into CS — the area is <a href="https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f" rel="nofollow noreferrer">in so much flux</a> that what's hot today becomes passe next year.  (Tnx <a href="https://cseducators.stackexchange.com/a/6998/8837">Qiulang</a> for that ref!) And so coming to anything with even moderate stability and lastingness is next to impossible.</p>
<p>And as your link indicates there are other areas to get into</p>
<ul>
<li>Mobile apps (Android/IOS)</li>
<li>IOT</li>
<li>ML</li>
<li>Crypto and Blockchain</li>
<li>Cloud</li>
<li>Dozens other areas which are hot; that is to say where the jobs are</li>
</ul>
<p>But <em>where the jobs are</em> and <em>what gets you a job</em>, especially a well-paid one, are far from being the same thing.  That latter is usually called CS or principles of programming or software engineering... and other names (with nuanced distinctions).</p>
<p>I'll stick to Programming-focused CS</p>
<h1>Mindset needed for CS</h1>
<ul>
<li>Causality Oriented</li>
<li>Value Neutral</li>
<li>Mathematical</li>
</ul>
<p>The last can be expanded again to Math, Engineering/technology and Language (linguistics).</p>
<p>Let me elaborate on each of these:</p>
<h2>Causality oriented</h2>
<p>For a programmer, causality oriented thinking is a very basic requirement.
Its a bit easier if we start with the debugging process.  You've done something. Its not working as desired.  How do you go about correcting the fault.  For that you've to follow a causal chain backwards: Z was unsatisfactory, Y causes/preceded Z. Is Y ok? If not from Y to ... All the way back to the start C,B,A (the start if necessary)</p>
<p>So clearly debugging is about following backward causality.  But even designing and programming is about causality.  E.W. Dijkstra showed that it is backward causality driven backward leading to seeming forward flow. <a href="https://cs.stackexchange.com/a/143671/24043">See</a></p>
<p>The very first COBOL program I wrote — about a 100 lines — gave me 300 errors! I was quite shaken. I fortunately discovered that I had forgotten an important mantra called <code>PROCEDURE DIVISION.</code>  Many of my classmates were less fortunate.  I remember one that was particularly scarred by the editor <code>vi</code>, the only available editor then.  He exemplified what one wag has said about <code>vi</code>, that it's a program that either beeps or corrupts the file.  For one who understands <code>vi</code> this is a joke but for the noob it can be traumatic!
If he had understood a single word that defines <code>vi</code> — <em>modal</em> — and spent half an hour understanding how modality defines <code>vi</code>'s behavior, his trauma would have vanished. Instead he chose to (try to) learn it by rote — i.e. <em>non-causally</em> — and found it traumatic.</p>
<p>This comes to the next point:</p>
<h2>Neutrality</h2>
<p>When you are given an error by a mechanical system do you get upset? Offended? Terrorized?</p>
<p>It's amusing when it's someone else in <a href="https://youtu.be/ZSljO3DqDDU" rel="nofollow noreferrer">a movie</a>. It's not when it's you. <strong>And its a choice.</strong>
Machines don't think, they don't choose, they don't <em>intend</em>.  <strong>We</strong> do these things — or at least should!
When you are a computer scientist, you don't stop being a human being. So you of course have your thoughts, values, intentions. <strong>But you must keep them to yourself, and not impose them on inanimate objects!</strong>  Easier said than done since we all know of being in the position of the man  in the video above!</p>
<p>One of the challenges I face as a programming teacher is to convince students to <strong>Read the error message!</strong>  For example in Python when you get an error you'll usually get
(a) the error (exception name)
(b) the file/line where it occurred
(c) a trace of the preceding events — the causal chain — that led to that &quot;event&quot;.</p>
<p>If you read these details you can start following the causal chain backwards and locate and correct the problem.  But if you are freaked out by the error as though someone scolded you, you'll never get there.  To not get freaked out you need to be <em>neutral</em>. And <em>curious/interested</em>.</p>
<h3>Personal (controversial?) opinion</h3>
<p>I believe you need to have an autistic streak to be a good programmer.  Of course <em>literally</em> this is not true ... there are obviously many good programmers who are not autistic.  But I conjecture that they are good because they're bimodal — i.e. they work in autist-mode when dealing with machines and human/empathic mode when dealing with human (and other) beings.
You don't have to become Dr. Spock and use nothing but rationality everywhere.
What is non-negotiable is that you use pure rationality when dealing with machines.</p>
<h1>Mathematics</h1>
<p>Dijkstra, an idiosyncratic but great CS-ist and CS teacher, punchily made the case that CS should be approached and taught as though it's a branch of pure formal math. See <a href="https://dl.acm.org/doi/10.1145/76380.76381" rel="nofollow noreferrer">CACM</a> for his view and the subsequent heated discussion.
While this is not exactly my opinion, I do believe that math is more central to CS than most practitioners/teachers believe.
My own view is more nuanced:</p>
<h1>Three legs of CS</h1>
<p><a href="https://en.wikipedia.org/wiki/Introduction_to_Automata_Theory,_Languages,_and_Computation" rel="nofollow noreferrer">Classic accounts</a> of (theoretical) CS are often based around the 3 pillars of CS:
(a) Automata (machines)
(b) Languages
(c) Computation.</p>
<p>These 3 areas have 3 characteristic and quite contrasting modes of approach.  CS-ists need to be fine with <em>all three.</em></p>
<p>Briefly</p>
<ul>
<li>Computation is math and is essentially about the infinite.</li>
<li>Machines are finite and is where the engineering/technology considerations lie.</li>
<li>Languages link the above two and is, for any programmer, the center-point where the action happens.</li>
</ul>
<p>A programmer needs to be fine with all these modes of thinking.</p>

CC BY-SA 4.0
2022-05-24T18:47:27.557Z
thanks a lot for taking the time to answer this, the personal opinion was the most important because sometimes i feel i need be more rational like dr spock and i feel bad because im not
helpmyandroid
CC BY-SA 4.0
2022-05-25T00:41:54.773Z
Be careful @helpmyandroid! Dr Spock is mythology.
Rushi
CC BY-SA 4.0
2022-05-25T17:06:02.507Z
"JS/Web is far from being the best entry into CS [because it's in flux]"--I disagree. Aside from Scratch, HTML/CSS/JS offers the easiest, most immediate and accessible way to make practical, graphical, engaging and fun projects. One can simply ignore all of the hyped web technologies of the past 20 years and play with HTML/CSS, add a bit of vanilla JS to make games, animations or add basic interactivity as necessary. The environment set-up is as easy as firing up a Codepen or Glitch project.
ggorlen
CC BY-SA 4.0
2022-05-26T02:59:33.000Z
Tnx for your comment @ggorlen. I'd encourage you to write a(nother) Web/JS focussed answer, especially considering the OP seems headed that-a-way. Eg between glitch codepen jsfiddle which to choose. And having chosen what path to take.  Myself: I'm a programming languages  guy and teacher. But I've never managed to enter the JS area because of the browser compatibility insane malarkey. And if you'd prefer a conversation, come over at [chat](https://chat.stackexchange.com/rooms/59174/the-classroom)
Rushi
CC BY-SA 4.0
2022-05-26T14:31:36.383Z
@ggorlen I should add: Today, especially in the JS/Web world, doing programming without doing it async seems to be backward/misguided...  But where on the spectrum of callback (hell) → promises → async → rx to place oneself is to me frankly a v v confusing question: See: (1) https://www.toptal.com/javascript/asynchronous-javascript-async-await-tutorial (2) https://goodguydaniel.com/blog/why-reactive-programming . I really thought the [rx stuff](https://reactivex.io/) looked the most promising. But all I hear ppl enthusing over is async/await
Rushi
CC BY-SA 4.0
2022-05-30T22:34:29.483Z
The three tendencies basically amount to an Engineering mindset: the desire to make things do stuff, safely and reliably. If making things do stuff is not one's most basic motivation, it will probably be tough sledding!
Scott Rowe
CC BY-SA 4.0
2022-05-31T06:18:23.643Z
@ScottRowe  I'd say science-engineering. Or in the language closer to our field "(Systems) *analysis* and *design*" . Maybe I should rewrite the answer from that standpoint... (unless you're writing one?)
Rushi
CC BY-SA 4.0
2022-05-24T08:33:23.090Z
2022-05-24T17:26:51.120Z
2022-05-24T17:26:51.120Z
Rushi
<p>I've found out a few quick shortcuts to answer this. What I'm about to say is not a complete answer, but I've found it to be so common with everyone I've worked with and all of my friends in the &quot;programming&quot; field that I think it's a good heuristic to determine early whether your <em>chances</em> of liking programming are high.</p>
<p>If you enjoy optimizing things, get irritated with repetition and wanted to do something to automate it away, enjoy games like factorio, and have at least a little bit of fun doing math and solving problems, then there's a reasonable chance that you will like it. My hypothesis here is that the things that give the dopamine rush which programming does tends to be present in what I listed. Obviously this is a far from exclusive list, so YMMV.</p>
<p>Programming seems hard at first but that's because it requires spending a few weeks (or more) seeing solutions to a variety of things before you learn how to map a problem onto something being solved by a computer.</p>
<blockquote>
<p>says it is something that is in high demand and can help me to get a job, is it ok or am I wasting my time?</p>
</blockquote>
<p>I think pursuing programming <em>just because</em> it is in high demand is a mistake for many reasons. The field is also quite demanding at times and I would hate to be in this field if I didn't love it as much as I do. Start doing it out of curiosity, and if you find yourself hooked, <em>then</em> consider it a career move.</p>

CC BY-SA 4.0
2022-06-08T11:45:33.047Z
Yeah, it's kind of like: "*What the heck is 'water'?*" Is that how you chose your name?
Scott Rowe
CC BY-SA 4.0
2022-06-06T23:11:41.163Z
2022-06-06T23:11:41.163Z
Water
<p>Only you can decide if programming is for you, but I'll try to offer a bit of context for making the call.</p>
<p>The TL;DR is that:</p>
<ul>
<li>It's normal to feel intimidated, that everyone is better than you, or frustrated by syntax or concepts. This is pretty much the universal state of affairs. Initial frustration doesn't necessarily mean your medium or long-term outcomes will be poor.</li>
<li>If one area of programming doesn't interest you or a project is too difficult, it's OK to set it aside and try something else (including things other than programming). Learning doesn't have to be all-or-nothing.</li>
<li>Stick to easier (but sufficiently challenging) projects, keeping in mind that almost everything winds up needing more effort than it seems.</li>
</ul>
<hr />
<p>First of all, programming is difficult. There are endless unforeseeable frustrations in store, and it'll always seem much more complex than it should. Part of learning to program, in my experience, is coming to expect and enjoy the difficulties and failures as much as the apps you'll build. The feeling of overcoming the challenges makes it fun for me. For other people, the product is more fun than the process. This can vary from project to project and over time.</p>
<p>That's not to say some things won't be easy, but those are usually the surprises rather than the common cases. The question is whether the time, energy and opportunity cost of learning to program is worth it over any alternative ways to spend your resources.</p>
<p>It's critical to have the motivation to want to do it in spite of the inevitable frustrations. For a lot of beginners I've worked with, the initial learning curve is too steep and they move on to other things that interest them more. There's just not enough payoff for the effort for them. They wanted to make a Minecraft but only wound up with a console-based calculator after weeks of effort. That's fine.</p>
<p>I've seen students initially struggle mightily with the most minor of syntax issues and appear to be on the verge of quitting, later to move on to successful programming careers. I've seen other students who seem to be learning rapidly and excelling, only to lose interest and quit (possibly temporarily). It's easy to think that initial hurdles and frustrations are indicators of a lack of aptitude, but I'm not sure if it's a strong predictor of long-term results. The key factor seems to be the urge from within to put effort and time into it, and that's not something you can force (but it can be nurtured).</p>
<p>For starters, I suggest picking easy, education-focused languages like <a href="https://scratch.mit.edu" rel="nofollow noreferrer">Scratch</a> and focusing on simple tasks that are challenging but not insurmountable. Try basic programming challenges on sites like <a href="https://open.kattis.com/problems" rel="nofollow noreferrer">Kattis</a> or <a href="https://www.codewars.com" rel="nofollow noreferrer">Codewars</a> (disclosure: I work for Codewars). Working with peers, a tutor or taking a class makes it easier to get yourself over the initial hurdles. Grab beginner-level books in areas of interest and work through them. Keeping it simple and building a solid foundation is a key way to avoiding feeling overwhelmed to the point of quitting.</p>
<p>If you embark on a project or technology that seems out of your comfort/interest zone, it's OK to set it aside and either revisit it later or abandon it entirely. I've dropped classes and set countless projects aside, putting the concepts on a &quot;to learn&quot; list. Later, I've found that I was able to finish some of these projects once the right opportunity came along, although the &quot;to learn&quot; list is ever-expanding since programming is an extremely broad field. There's no way to learn everything, so deciding where to focus energy is a key skill to develop. It's hard to know what one's interests might be initially, so don't be afraid to experiment.</p>
<blockquote>
<p>I feel that I can not imagine some things that seem to be easy for everyone when they talk.</p>
</blockquote>
<p>Feeling like everyone else isn't struggling but you are can be a sign of <a href="https://en.wikipedia.org/wiki/Impostor_syndrome" rel="nofollow noreferrer">impostor syndrome</a>. I've dealt with it during my programming career. I'm not sure I have much concrete advice other than to suggest that it's widespread and likely that others feel much the same as you. Sometimes you're the most knowledgeable in the group and sometimes you're the least. It's good to pursue both scenarios regularly and be comfortable with both. Even when you may feel the least skilled, there are ideas and perspectives you can offer a project or a team; try to find them. Sometimes, just being another person to contribute makes your skills and time valuable, and that's OK too in some projects.</p>
<p>If other things interest you more than programming, it's OK to pursue those. Whatever time you <em>did</em> spend on programming won't be wasted, since computer and problem-solving skills translate to pretty much any other area of life you wind up in. Learning programming doesn't have to be all-or-nothing and is highly multi-disciplinary.</p>
<p>For example, knowing a bit of JavaScript and having some familiarity with the browser console can help you diagnose and fix problems with many websites, like broken modals. You can write simple <a href="https://en.wikipedia.org/wiki/Userscript" rel="nofollow noreferrer">userscripts</a> or <a href="https://en.wikipedia.org/wiki/Bookmarklet" rel="nofollow noreferrer">bookmarklets</a> to avoid repetitive tasks or make a website more usable. Being able to write basic HTML and CSS can help you make or customize a blog or personal page and get your ideas on the internet. Practical books like <a href="https://automatetheboringstuff.com/" rel="nofollow noreferrer">Automate the Boring Stuff with Python</a> are great ways to pick up enough scripting skills to manipulate spreadsheets, rename files in bulk, pull data off the internet programmatically and other tasks that will come in handy if you use computers often. I find it empowering to be able to control the thing we spend a good chunk of our lives on, even in a small capacity. Learning a bit about operating systems, mobile app development, smart phone technology or networking is useful due to their ubiquity. At the very least, you'll enhance your appreciation of the technology.</p>

CC BY-SA 4.0
2022-05-30T22:29:56.553Z
I agree strongly with: "*The key factor seems to be the urge from within to put effort and time into it*". Eventually earning money is not a very motivating force.
Scott Rowe
CC BY-SA 4.0
2022-05-25T18:28:20.630Z
2022-05-25T18:28:20.630Z
ggorlen
<p>How do you decided if programming is for you? Have some fun with it.</p>
<p>Pick up your phone, laptop or tablet and look for games that have programming as a mechanic. Two favorites of mine are <a href="https://apps.apple.com/us/app/cargo-bot/id519690804" rel="nofollow noreferrer">Cargobot</a> (iPad) and <a href="https://store.steampowered.com/app/375820/Human_Resource_Machine/" rel="nofollow noreferrer">Human Resource Machine</a> (iOS and Steam). If you have fun solving the puzzles you might be ready for the next step.</p>
<p>Download an IDE that is easy to understand in a language the is fun to use. I would suggest <a href="https://thonny.org/" rel="nofollow noreferrer">Thonny.org</a> which will install Python for you.</p>
<p>Now that you have a fun language and an easy to use system, the trick is to keep it fun. The way I keep it fun is to try to solve some problem, write a game, or draw a picture. Keep it small so you aren't overwhelmed. If you do a search on &quot;Python Turtle Example&quot; or &quot;Python Turtle Game&quot; you will find a bunch of straight forward examples. At the beginning, skip any example if you see the keywords &quot;self&quot; or &quot;class&quot;. Those are related to objects and classes and are too much for a newbie.</p>
<p>Once you find an example that you think you can follow, don't just copy and paste it.  Type it in by hand. The process of typing in the commands one at a time will internalize the process, and help the ideas sink in.  If you come to anything you don't understand don't let it go. Search the net for an explanation.  Don't know what &quot;def&quot; means... search &quot;python def&quot;. Never seen &quot;for&quot; used like that... search &quot;python for loop&quot;.  Don't understand why every program has import at the top... search &quot;python import&quot;.</p>
<p>The trick to knowing if you are cut out for programming is how you dealt with frustration you encountered during your exploration. If you found confusion as an opportunity to learn new things... if you were comfortable with not knowing all of the answers... if after fighting a block for two days and finally finding the answer you burst into hysterical laughter and ran to show your friends... well... then programming might be right for you.</p>

CC BY-SA 4.0
2022-06-08T11:48:19.677Z
Just bear in mind that most of your friends will have no clue what you are going on about.
Scott Rowe
CC BY-SA 4.0
2022-06-26T02:45:33.897Z
If they are true friends, they will eagerly listen, even if they don't completely understand.  :-)
codingCat
CC BY-SA 4.0
2022-07-03T01:42:39.873Z
Yes. However, for some, any kind of thought-form can be a recreation, but for others, equally it just isn't. That's fine, but expecting some to still listen eagerly is perhaps not well.
Scott Rowe
CC BY-SA 4.0
2022-05-25T15:29:36.047Z
2022-05-25T15:29:36.047Z
codingCat
<p>I am with the complication of having to choose a career, I am 17 years old and I see that programming is giving a lot of work in Argentina but some concepts confuse me, I just read this <a href="https://aprendelo.org/que-estudiar-para-ser-programador/" rel="nofollow noreferrer">https://aprendelo.org/que-estudiar-para-ser-programador/</a> but I do not know if it is for me, I did a tutorial on YouTube on how to make a calculator in JavaScript and I feel that there are things that are very in the air when they talk about loops and indexes, I feel that I cannot imagine some things that seem to be easy for everyone when they talk.</p>
<p>so I would like to know if there is any programming language that does not have a high level of abstraction, at the moment I am starting with html and CSS, I am going to add JavaScript because from what the tutorial says it is something that is in high demand and can help me to get a job, is it ok or am I wasting my time?</p>
<p>Thanks.</p>

CC BY-SA 4.0
2022-05-24T01:13:53.357Z
Not understanding can generally be addressed by sticking at it & figuring out. Not being interested is much harder to address. When I was your age (over 40 years ago) I had to read a single program of 3 lines for 3 months before it clicked. That's not the norm of course. But that kind of grit can be a requirement
Rushi
CC BY-SA 4.0
2022-05-24T07:46:58.927Z
start with HTML/CSS on this website and the progress to JAvascript/PHP/SQL 
https://www.w3schools.com/sql/default.asp
A.bakker
CC BY-SA 4.0
2022-05-26T15:42:28.847Z
Re, "[is there] any...language that does not have a high level of abstraction?" Sure. It's called "[assembly language](https://en.wikipedia.org/wiki/Assembly_language)." But, good luck starting _there!!_ Assembly language lets you express programs in terms of the hardware architecture. Hard work, not very rewarding. You'll be happier using a language that lets you express solutions in terms of the problem space (i.e., in a "higher-level" language.) You _want_ a high level of abstraction, but not _too_ high. "_Very_ high level" often means "highly specialized."
Solomon Slow
CC BY-SA 4.0
2022-05-30T22:42:04.290Z
Often you'll find that if something in programming is confusing, when you do understand later, you will probably understand better than people who seemed to understand right away. If you learn differently than the other students and how it is taught, that can be very good if you stay with it. It depends on whether you feel good about learning it, or If it is just always unrewarding.
Scott Rowe
CC BY-SA 4.0
2022-06-10T21:31:25.240Z
What computer programmers call abstraction, and what teachers call abstraction is almost completely at odds. In programming more abstract (high level) means abstracted away from the machine, and toward the human. Therefore, high-level abstract languages are easier than low-level less-abstract languages.
ctrl-alt-delor
<self-learning>
How can I understand if programming is for me?
# How can I understand if programming is for me?

(Asked by: username_0 on 2022-05-23)

I am with the complication of having to choose a career, I am 17 years old and I see that programming is giving a lot of work in Argentina but some concepts confuse me, I just read this <https://aprendelo.org/que-estudiar-para-ser-programador/> but I do not know if it is for me, I did a tutorial on YouTube on how to make a calculator in JavaScript and I feel that there are things that are very in the air when they talk about loops and indexes, I feel that I cannot imagine some things that seem to be easy for everyone when they talk.

so I would like to know if there is any programming language that does not have a high level of abstraction, at the moment I am starting with html and CSS, I am going to add JavaScript because from what the tutorial says it is something that is in high demand and can help me to get a job, is it ok or am I wasting my time?

Thanks.

**Tags:** self-learning

> **Comments:**
> **username_1**: Not understanding can generally be addressed by sticking at it & figuring out. Not being interested is much harder to address. When I was your age (over 40 years ago) I had to read a single program of 3 lines for 3 months before it clicked. That's not the norm of course. But that kind of grit can be a requirement  
> **username_2**: start with HTML/CSS on this website and the progress to JAvascript/PHP/SQL  https://www.w3schools.com/sql/default.asp  
> **username_3**: Re, "[is there] any...language that does not have a high level of abstraction?" Sure. It's called "[assembly language](https://en.wikipedia.org/wiki/Assembly_language)." But, good luck starting _there!!_ Assembly language lets you express programs in terms of the hardware architecture. Hard work, not very rewarding. You'll be happier using a language that lets you express solutions in terms of the problem space (i.e., in a "higher-level" language.) You _want_ a high level of abstraction, but not _too_ high. "_Very_ high level" often means "highly specialized."  
> **username_4**: Often you'll find that if something in programming is confusing, when you do understand later, you will probably understand better than people who seemed to understand right away. If you learn differently than the other students and how it is taught, that can be very good if you stay with it. It depends on whether you feel good about learning it, or If it is just always unrewarding.  
> **username_5**: What computer programmers call abstraction, and what teachers call abstraction is almost completely at odds. In programming more abstract (high level) means abstracted away from the machine, and toward the human. Therefore, high-level abstract languages are easier than low-level less-abstract languages.  

---

## 4 answers

### Answer by username_1 on 2022-05-24. Score: 5 | Accepted answer

Firstly, html/css are not programming languages though they are languages.
Javascript is a programming language but JS/Web is far from being the best entry into CS — the area is [in so much flux](https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f) that what's hot today becomes passe next year. (Tnx [Qiulang](https://cseducators.stackexchange.com/a/6998/8837) for that ref!) And so coming to anything with even moderate stability and lastingness is next to impossible.

And as your link indicates there are other areas to get into

* Mobile apps (Android/IOS)
* IOT
* ML
* Crypto and Blockchain
* Cloud
* Dozens other areas which are hot; that is to say where the jobs are

But *where the jobs are* and *what gets you a job*, especially a well-paid one, are far from being the same thing. That latter is usually called CS or principles of programming or software engineering... and other names (with nuanced distinctions).

I'll stick to Programming-focused CS

# Mindset needed for CS

* Causality Oriented
* Value Neutral
* Mathematical

The last can be expanded again to Math, Engineering/technology and Language (linguistics).

Let me elaborate on each of these:

## Causality oriented

For a programmer, causality oriented thinking is a very basic requirement.
Its a bit easier if we start with the debugging process. You've done something. Its not working as desired. How do you go about correcting the fault. For that you've to follow a causal chain backwards: Z was unsatisfactory, Y causes/preceded Z. Is Y ok? If not from Y to ... All the way back to the start C,B,A (the start if necessary)

So clearly debugging is about following backward causality. But even designing and programming is about causality. E.W. Dijkstra showed that it is backward causality driven backward leading to seeming forward flow. [See](https://cs.stackexchange.com/a/143671/24043)

The very first COBOL program I wrote — about a 100 lines — gave me 300 errors! I was quite shaken. I fortunately discovered that I had forgotten an important mantra called `PROCEDURE DIVISION.` Many of my classmates were less fortunate. I remember one that was particularly scarred by the editor `vi`, the only available editor then. He exemplified what one wag has said about `vi`, that it's a program that either beeps or corrupts the file. For one who understands `vi` this is a joke but for the noob it can be traumatic!
If he had understood a single word that defines `vi` — *modal* — and spent half an hour understanding how modality defines `vi`'s behavior, his trauma would have vanished. Instead he chose to (try to) learn it by rote — i.e. *non-causally* — and found it traumatic.

This comes to the next point:

## Neutrality

When you are given an error by a mechanical system do you get upset? Offended? Terrorized?

It's amusing when it's someone else in [a movie](https://youtu.be/ZSljO3DqDDU). It's not when it's you. **And its a choice.**
Machines don't think, they don't choose, they don't *intend*. **We** do these things — or at least should!
When you are a computer scientist, you don't stop being a human being. So you of course have your thoughts, values, intentions. **But you must keep them to yourself, and not impose them on inanimate objects!** Easier said than done since we all know of being in the position of the man in the video above!

One of the challenges I face as a programming teacher is to convince students to **Read the error message!** For example in Python when you get an error you'll usually get
(a) the error (exception name)
(b) the file/line where it occurred
(c) a trace of the preceding events — the causal chain — that led to that "event".

If you read these details you can start following the causal chain backwards and locate and correct the problem. But if you are freaked out by the error as though someone scolded you, you'll never get there. To not get freaked out you need to be *neutral*. And *curious/interested*.

### Personal (controversial?) opinion

I believe you need to have an autistic streak to be a good programmer. Of course *literally* this is not true ... there are obviously many good programmers who are not autistic. But I conjecture that they are good because they're bimodal — i.e. they work in autist-mode when dealing with machines and human/empathic mode when dealing with human (and other) beings.
You don't have to become Dr. Spock and use nothing but rationality everywhere.
What is non-negotiable is that you use pure rationality when dealing with machines.

# Mathematics

Dijkstra, an idiosyncratic but great CS-ist and CS teacher, punchily made the case that CS should be approached and taught as though it's a branch of pure formal math. See [CACM](https://dl.acm.org/doi/10.1145/76380.76381) for his view and the subsequent heated discussion.
While this is not exactly my opinion, I do believe that math is more central to CS than most practitioners/teachers believe.
My own view is more nuanced:

# Three legs of CS

[Classic accounts](https://en.wikipedia.org/wiki/Introduction_to_Automata_Theory,_Languages,_and_Computation) of (theoretical) CS are often based around the 3 pillars of CS:
(a) Automata (machines)
(b) Languages
(c) Computation.

These 3 areas have 3 characteristic and quite contrasting modes of approach. CS-ists need to be fine with *all three.*

Briefly

* Computation is math and is essentially about the infinite.
* Machines are finite and is where the engineering/technology considerations lie.
* Languages link the above two and is, for any programmer, the center-point where the action happens.

A programmer needs to be fine with all these modes of thinking.

> **Comments:**
> **username_0**: thanks a lot for taking the time to answer this, the personal opinion was the most important because sometimes i feel i need be more rational like dr spock and i feel bad because im not  
> **username_1**: Be careful @username_0! Dr Spock is mythology.  
> **username_6**: "JS/Web is far from being the best entry into CS [because it's in flux]"--I disagree. Aside from Scratch, HTML/CSS/JS offers the easiest, most immediate and accessible way to make practical, graphical, engaging and fun projects. One can simply ignore all of the hyped web technologies of the past 20 years and play with HTML/CSS, add a bit of vanilla JS to make games, animations or add basic interactivity as necessary. The environment set-up is as easy as firing up a Codepen or Glitch project.  
> **username_1**: Tnx for your comment @username_6. I'd encourage you to write a(nother) Web/JS focussed answer, especially considering the OP seems headed that-a-way. Eg between glitch codepen jsfiddle which to choose. And having chosen what path to take.  Myself: I'm a programming languages  guy and teacher. But I've never managed to enter the JS area because of the browser compatibility insane malarkey. And if you'd prefer a conversation, come over at [chat](https://chat.stackexchange.com/rooms/59174/the-classroom)  
> **username_1**: @username_6 I should add: Today, especially in the JS/Web world, doing programming without doing it async seems to be backward/misguided...  But where on the spectrum of callback (hell) → promises → async → rx to place oneself is to me frankly a v v confusing question: See: (1) https://www.toptal.com/javascript/asynchronous-javascript-async-await-tutorial (2) https://goodguydaniel.com/blog/why-reactive-programming . I really thought the [rx stuff](https://reactivex.io/) looked the most promising. But all I hear ppl enthusing over is async/await  
> **username_4**: The three tendencies basically amount to an Engineering mindset: the desire to make things do stuff, safely and reliably. If making things do stuff is not one's most basic motivation, it will probably be tough sledding!  
> **username_1**: @ScottRowe  I'd say science-engineering. Or in the language closer to our field "(Systems) *analysis* and *design*" . Maybe I should rewrite the answer from that standpoint... (unless you're writing one?)  

---

### Answer by username_7 on 2022-06-06. Score: 3

I've found out a few quick shortcuts to answer this. What I'm about to say is not a complete answer, but I've found it to be so common with everyone I've worked with and all of my friends in the "programming" field that I think it's a good heuristic to determine early whether your *chances* of liking programming are high.

If you enjoy optimizing things, get irritated with repetition and wanted to do something to automate it away, enjoy games like factorio, and have at least a little bit of fun doing math and solving problems, then there's a reasonable chance that you will like it. My hypothesis here is that the things that give the dopamine rush which programming does tends to be present in what I listed. Obviously this is a far from exclusive list, so YMMV.

Programming seems hard at first but that's because it requires spending a few weeks (or more) seeing solutions to a variety of things before you learn how to map a problem onto something being solved by a computer.

> says it is something that is in high demand and can help me to get a job, is it ok or am I wasting my time?

I think pursuing programming *just because* it is in high demand is a mistake for many reasons. The field is also quite demanding at times and I would hate to be in this field if I didn't love it as much as I do. Start doing it out of curiosity, and if you find yourself hooked, *then* consider it a career move.

> **Comments:**
> **username_4**: Yeah, it's kind of like: "*What the heck is 'water'?*" Is that how you chose your name?  

---

### Answer by username_6 on 2022-05-25. Score: 2

Only you can decide if programming is for you, but I'll try to offer a bit of context for making the call.

The TL;DR is that:

* It's normal to feel intimidated, that everyone is better than you, or frustrated by syntax or concepts. This is pretty much the universal state of affairs. Initial frustration doesn't necessarily mean your medium or long-term outcomes will be poor.
* If one area of programming doesn't interest you or a project is too difficult, it's OK to set it aside and try something else (including things other than programming). Learning doesn't have to be all-or-nothing.
* Stick to easier (but sufficiently challenging) projects, keeping in mind that almost everything winds up needing more effort than it seems.

---

First of all, programming is difficult. There are endless unforeseeable frustrations in store, and it'll always seem much more complex than it should. Part of learning to program, in my experience, is coming to expect and enjoy the difficulties and failures as much as the apps you'll build. The feeling of overcoming the challenges makes it fun for me. For other people, the product is more fun than the process. This can vary from project to project and over time.

That's not to say some things won't be easy, but those are usually the surprises rather than the common cases. The question is whether the time, energy and opportunity cost of learning to program is worth it over any alternative ways to spend your resources.

It's critical to have the motivation to want to do it in spite of the inevitable frustrations. For a lot of beginners I've worked with, the initial learning curve is too steep and they move on to other things that interest them more. There's just not enough payoff for the effort for them. They wanted to make a Minecraft but only wound up with a console-based calculator after weeks of effort. That's fine.

I've seen students initially struggle mightily with the most minor of syntax issues and appear to be on the verge of quitting, later to move on to successful programming careers. I've seen other students who seem to be learning rapidly and excelling, only to lose interest and quit (possibly temporarily). It's easy to think that initial hurdles and frustrations are indicators of a lack of aptitude, but I'm not sure if it's a strong predictor of long-term results. The key factor seems to be the urge from within to put effort and time into it, and that's not something you can force (but it can be nurtured).

For starters, I suggest picking easy, education-focused languages like [Scratch](https://scratch.mit.edu) and focusing on simple tasks that are challenging but not insurmountable. Try basic programming challenges on sites like [Kattis](https://open.kattis.com/problems) or [Codewars](https://www.codewars.com) (disclosure: I work for Codewars). Working with peers, a tutor or taking a class makes it easier to get yourself over the initial hurdles. Grab beginner-level books in areas of interest and work through them. Keeping it simple and building a solid foundation is a key way to avoiding feeling overwhelmed to the point of quitting.

If you embark on a project or technology that seems out of your comfort/interest zone, it's OK to set it aside and either revisit it later or abandon it entirely. I've dropped classes and set countless projects aside, putting the concepts on a "to learn" list. Later, I've found that I was able to finish some of these projects once the right opportunity came along, although the "to learn" list is ever-expanding since programming is an extremely broad field. There's no way to learn everything, so deciding where to focus energy is a key skill to develop. It's hard to know what one's interests might be initially, so don't be afraid to experiment.

> I feel that I can not imagine some things that seem to be easy for everyone when they talk.

Feeling like everyone else isn't struggling but you are can be a sign of [impostor syndrome](https://en.wikipedia.org/wiki/Impostor_syndrome). I've dealt with it during my programming career. I'm not sure I have much concrete advice other than to suggest that it's widespread and likely that others feel much the same as you. Sometimes you're the most knowledgeable in the group and sometimes you're the least. It's good to pursue both scenarios regularly and be comfortable with both. Even when you may feel the least skilled, there are ideas and perspectives you can offer a project or a team; try to find them. Sometimes, just being another person to contribute makes your skills and time valuable, and that's OK too in some projects.

If other things interest you more than programming, it's OK to pursue those. Whatever time you *did* spend on programming won't be wasted, since computer and problem-solving skills translate to pretty much any other area of life you wind up in. Learning programming doesn't have to be all-or-nothing and is highly multi-disciplinary.

For example, knowing a bit of JavaScript and having some familiarity with the browser console can help you diagnose and fix problems with many websites, like broken modals. You can write simple [userscripts](https://en.wikipedia.org/wiki/Userscript) or [bookmarklets](https://en.wikipedia.org/wiki/Bookmarklet) to avoid repetitive tasks or make a website more usable. Being able to write basic HTML and CSS can help you make or customize a blog or personal page and get your ideas on the internet. Practical books like [Automate the Boring Stuff with Python](https://automatetheboringstuff.com/) are great ways to pick up enough scripting skills to manipulate spreadsheets, rename files in bulk, pull data off the internet programmatically and other tasks that will come in handy if you use computers often. I find it empowering to be able to control the thing we spend a good chunk of our lives on, even in a small capacity. Learning a bit about operating systems, mobile app development, smart phone technology or networking is useful due to their ubiquity. At the very least, you'll enhance your appreciation of the technology.

> **Comments:**
> **username_4**: I agree strongly with: "*The key factor seems to be the urge from within to put effort and time into it*". Eventually earning money is not a very motivating force.  

---

### Answer by username_8 on 2022-05-25. Score: 2

How do you decided if programming is for you? Have some fun with it.

Pick up your phone, laptop or tablet and look for games that have programming as a mechanic. Two favorites of mine are [Cargobot](https://apps.apple.com/us/app/cargo-bot/id519690804) (iPad) and [Human Resource Machine](https://store.steampowered.com/app/375820/Human_Resource_Machine/) (iOS and Steam). If you have fun solving the puzzles you might be ready for the next step.

Download an IDE that is easy to understand in a language the is fun to use. I would suggest [Thonny.org](https://thonny.org/) which will install Python for you.

Now that you have a fun language and an easy to use system, the trick is to keep it fun. The way I keep it fun is to try to solve some problem, write a game, or draw a picture. Keep it small so you aren't overwhelmed. If you do a search on "Python Turtle Example" or "Python Turtle Game" you will find a bunch of straight forward examples. At the beginning, skip any example if you see the keywords "self" or "class". Those are related to objects and classes and are too much for a newbie.

Once you find an example that you think you can follow, don't just copy and paste it. Type it in by hand. The process of typing in the commands one at a time will internalize the process, and help the ideas sink in. If you come to anything you don't understand don't let it go. Search the net for an explanation. Don't know what "def" means... search "python def". Never seen "for" used like that... search "python for loop". Don't understand why every program has import at the top... search "python import".

The trick to knowing if you are cut out for programming is how you dealt with frustration you encountered during your exploration. If you found confusion as an opportunity to learn new things... if you were comfortable with not knowing all of the answers... if after fighting a block for two days and finally finding the answer you burst into hysterical laughter and ran to show your friends... well... then programming might be right for you.

> **Comments:**
> **username_4**: Just bear in mind that most of your friends will have no clue what you are going on about.  
> **username_8**: If they are true friends, they will eagerly listen, even if they don't completely understand.  :-)  
> **username_4**: Yes. However, for some, any kind of thought-form can be a recreation, but for others, equally it just isn't. That's fine, but expecting some to still listen eagerly is perhaps not well.  

---

