The Developer Environment
SAP Implementation Consulting & ERP - Startupistan Germany · Block I · study notes for revision.
Before I write a single line of real code, my machine needs a workbench: a place to type commands, and four tools that do the actual work. This chapter is that setup, from zero. Nothing here assumes I’ve ever opened a terminal before.
Two ways to talk to a computer
Section titled “Two ways to talk to a computer”There are exactly two ways to give a computer instructions:
- GUI - Graphical User Interface. Clicking icons, dragging windows, picking from menus. This is how nearly everyone uses a computer.
- CLI - Command-Line Interface. Typing a written instruction, pressing Enter, and reading a written answer. Older, and still everywhere in the developer world.
The terminal is the window where the CLI happens.
The vocabulary that gets used loosely
Section titled “The vocabulary that gets used loosely”Four words float around, related but not identical. Worth pinning down once:
| Word | What it actually means |
|---|---|
| Terminal | The window - the app I open (Windows Terminal, macOS Terminal, GNOME Terminal, Hyper) |
| Shell | The program inside that reads and runs my commands (PowerShell, Bash, Zsh) |
| Command line | The line I type on - and loosely, this whole way of working |
| Console | An older, catch-all synonym for any of the above |
In everyday speech developers mix these freely. “Open a console,” “open a shell,” “open a terminal” all mean the same thing: get to the place where I can type commands.
Why developers bother typing
Section titled “Why developers bother typing”If clicking works, why type?
- The tools live there. Git, Node.js, and npm are command-line tools first. Their native home is the terminal, and every tutorial online assumes it.
- It’s precise and repeatable. A command is one exact thing - copyable, shareable, re-runnable identically. “Click the third icon, then the second tab” is none of those.
- It scales. Renaming one file is easier with a mouse. Renaming five hundred is one command.
- Servers have no desktop. The machines that run real software usually have no GUI at all. The command line is how professionals reach them.
Opening a terminal
Section titled “Opening a terminal”Same idea on every system: a mostly empty window with a short line of text waiting for me. How I open it differs.
The built-in app is called Terminal (also Windows Terminal), and it runs the PowerShell shell.
- Press the Windows key (or click Start).
- Type
terminal. - Press Enter (or click Terminal).
A window opens with a line like PS C:\Users\ravi>. On older Windows 10 machines Terminal may be missing - search powershell instead and open Windows PowerShell; same place.
Ignore Command Prompt (cmd): it’s an older shell this program doesn’t use. If a window shows C:\Users\ravi> without the PS, close it and open Terminal/PowerShell.
This program sets up Hyper (hyper.is) as the terminal, running the Zsh shell.
- Press Cmd + Space to open Spotlight.
- Type
hyper. - Press Enter.
Hyper’s prompt is themed (colored blocks and arrows instead of plain text), but the shell underneath is ordinary Zsh - every command works the same. The always-there fallback is the built-in Terminal app (Cmd + Space → terminal).
This program sets up Hyper (hyper.is) as the terminal, running Bash.
Search my applications for hyper and open it. Themed prompt, ordinary shell underneath.
The always-there fallback is my distribution’s own terminal - GNOME Terminal on Ubuntu, Konsole on KDE - usually one Ctrl + Alt + T away. A plain prompt looks like ravi@laptop:~$.
Essential commands - the reference table
Section titled “Essential commands - the reference table”Everything is the same loop: type, Enter, read the answer. Here’s the working vocabulary. Most of these aliases work in PowerShell too, but where Windows differs I’ve noted its native command.
| Command | What it does | macOS / Linux | Windows PowerShell |
|---|---|---|---|
| pwd | Print working directory - “where am I?” | pwd | pwd |
| ls / dir | List what’s in this folder | ls | ls or dir |
| cd | Change directory - step into a folder | cd Documents | cd Documents |
| cd .. | Step up one folder (.. = the folder above) | cd .. | cd .. |
| mkdir | Make a new folder here | mkdir projects | mkdir projects |
| touch / New-Item | Create an empty file | touch notes.txt | New-Item notes.txt |
| cat | Show a file’s contents in the terminal | cat notes.txt | cat notes.txt |
| echo | Print text back (or into a file) | echo "hi" | echo "hi" |
| clear / cls | Wipe the screen clean (history stays) | clear | clear or cls |
| mv | Move or rename a file/folder | mv a.txt b.txt | mv a.txt b.txt |
| cp | Copy a file | cp a.txt copy.txt | cp a.txt copy.txt |
| rm | Delete a file (add -r for a folder) | rm old.txt | rm old.txt |
Here’s what the loop actually feels like - a short walk that uses the first five. The $ is the prompt, so I type only what follows it; lines without a $ are the computer answering:
$ pwd/Users/ravi$ lsDesktop Documents Downloads$ cd Documents$ pwd/Users/ravi/Documents$ mkdir startupistan$ lsstartupistan$ cd ..$ pwd/Users/raviRead it like a story: check where I am, look around, step in, confirm, make a folder, step back out, confirm. That check-move-confirm rhythm is exactly how experienced developers move around too.
Reading and fixing command-line errors
Section titled “Reading and fixing command-line errors”Sooner or later the terminal answers with a complaint instead of what I wanted. That’s good - the error is the shell being helpful, and it always stops before doing anything. An error never means I broke the computer. The three I’ll meet first:
| Error message | What it really means | The fix |
|---|---|---|
command not found / not recognized | The first word isn’t a command it knows - a typo, or the program isn’t installed | Check spelling first; if spelt right, it’s an install/PATH issue (see troubleshooting) |
no such file or directory | It knows the command, but can’t see that folder/file from where I’m standing | pwd to see where I am, ls to see what’s here, then cd to what actually shows |
too many arguments | A space in a name split it into two pieces | Wrap the name in quotes: cd "My Projects" - or avoid spaces entirely |
The four core tools
Section titled “The four core tools”My machine runs on four tools, one per job. Together they form a loop I’ll repeat thousands of times: write → run → check → save → repeat.
| Tool | What it is | Its one job |
|---|---|---|
| VS Code | A code editor | Write and organize code |
| Git | A version-control system | Remember - record the history of my work so nothing is ever lost |
| Node.js | A JavaScript runtime (brings npm) | Run JavaScript outside the browser, and install building blocks |
| The browser (Chrome) | A browser + inspection lab | Show and inspect - where web code runs, previews, and gets debugged |
Git = version control
Section titled “Git = version control”The problem Git solves is the folder full of website-final.html, website-final2.html, website-FINAL-REALLY.html. Which one did I send? What changed between two of them? What broke it today? A version-control system (VCS) answers all of that properly:
- Save points - at any moment I choose, it snapshots the whole project with a timestamp, my name, and a message.
- A readable history - the full list of those save points, so “what changed, when, why” is always answerable.
- Time travel - any earlier save point can be restored. Broke something today? Back to yesterday’s working state in seconds.
- Safe teamwork - several people work on the same project; the VCS merges their work and shows exactly where it collides.
Git is the standard VCS - so dominant that “version control” and “Git” are near-synonyms.
Node.js = run JavaScript outside the browser
Section titled “Node.js = run JavaScript outside the browser”JavaScript is the language of the web, and for years it could only run inside a browser. Node.js is a runtime - a program whose job is to run programs - that removed that cage. Install it, and JavaScript runs directly on my machine, no browser needed. That turned JavaScript into a language that also powers servers, command-line tools, and nearly all modern web-development tooling.
The browser = inspect and debug
Section titled “The browser = inspect and debug”To most people a browser just shows websites. To a developer it’s the machine their work runs on - HTML, CSS, and JavaScript run inside the browser of whoever opens the page. That makes it my test bench, plus a full inspection lab one right-click away.
-
Right-click anything on a page (a headline works well) and choose Inspect.
-
A panel opens - the DevTools (Developer Tools). The Elements tab shows the page’s actual HTML; hovering a line highlights the matching part of the page.
-
Double-click a headline’s text, type something else, press Enter - the page changes. Now refresh: it’s back.
Editor vs IDE
Section titled “Editor vs IDE”Someone will eventually ask which IDE I use. The honest answer needs a definition first, because the distinction returns when this program reaches SAP.
| Code editor | IDE (Integrated Development Environment) | |
|---|---|---|
| Starts as | Light and general - edits any language out of the box | A complete workshop for one ecosystem, everything preinstalled |
| Grows via | Extensions I choose, per project | Already wired together: build system, debugger, templates, refactoring |
| Examples | VS Code, Sublime Text, Vim | IntelliJ (Java), PyCharm (Python), Visual Studio (.NET), Eclipse |
| Best when | One tool must cover many languages | Deep, single-ecosystem work |
The golden rule of setup
Section titled “The golden rule of setup”Before any install steps, the one habit that prevents half of all “it didn’t work” moments:
Two more facts before installing anything:
- Know my machine. Every download page asks what I’m running. Windows: type
about→ About your PC (or runwinver). macOS: Apple menu → About This Mac. Linux:cat /etc/os-release. - Administrator rights. Installing changes the machine for every user, so the OS asks permission - the “allow this app to make changes?” pop-up on Windows, a password prompt on macOS/Linux (where the terminal word is sudo). On my own laptop I click Yes / type my password. On a company or family device, installs may be locked to someone else’s account - that’s policy, not an error; the fix is asking the owner or IT, not fighting the dialog.
Verify, then install
Section titled “Verify, then install”Everything was set up at program start, so the first move for each tool is verify - check it already works. Install steps are the reference for a new machine or a reinstall.
The terminal (macOS & Linux only)
Section titled “The terminal (macOS & Linux only)”Windows uses Windows Terminal - nothing to do. macOS/Linux run Hyper, and it’s verified first because everything else gets checked inside a terminal.
-
Open Hyper (Cmd + Space →
hyperon macOS; app search on Linux). -
Run a command to prove the shell behind the theme:
Terminal window $ pwd/Users/ravi -
Opens and answers - verified. Install reference: download from hyper.is; on macOS drag it into Applications, on Linux install the
.deb(sudo apt install ./hyper_*.deb). Built-in terminals (macOS Terminal, GNOME Terminal) are the permanent fallback.
-
In a terminal, run the check:
Terminal window $ git --versiongit version 2.45.1 -
Any version number = done. My number will differ - that’s fine. Only
command not foundneeds fixing: try a fresh terminal first, then install. -
Install reference:
Download the installer from git-scm.com/downloads, run it, and accept the defaults on every screen - the wall of option pages intimidates everyone once, but none of them need changing here. It also installs Git Bash, a bonus terminal that speaks the macOS/Linux command language. Open a new terminal and run git --version.
Installed via Homebrew (brew.sh), the Mac’s popular package manager. One-time prep first:
$ touch ~/.zshrctouch creates the file if it’s missing (harmless if it exists). ~/.zshrc is my Zsh config, read every time a terminal opens - it’s where Homebrew and nvm write their setup lines. On a fresh Mac it doesn’t exist yet, and without it those lines have nowhere to go, causing mysterious command not found errors later. Then:
$ brew --version # confirm Homebrew is present$ brew install git # install GitVerify with git --version in a fresh terminal.
My package manager already has it:
$ sudo apt install git(Fedora and others use dnf; the package is called git everywhere.) Verify afterwards in a fresh terminal.
Node.js (and npm)
Section titled “Node.js (and npm)”Node brings npm along, so this is two checks in one:
$ node --versionv22.14.0$ npm --version10.9.0Two version numbers = done. Different numbers are expected.
Download the LTS installer from nodejs.org, run it with defaults. npm rides along automatically - no separate install. Open a new terminal and run both verify commands.
Installed via nvm (Node Version Manager). ~/.zshrc must exist first (the touch ~/.zshrc from the Git step covers it). Then:
$ nvm --version # confirm nvm is present$ nvm install --lts # install the stable line by nameThe --lts flag asks for the stable line explicitly. Verify with node --version and npm --version in a fresh terminal.
Installed via nvm (Node Version Manager):
$ nvm --version # confirm nvm is present$ nvm install --lts # install the stable line by nameIf nvm says command not found, install it from github.com/nvm-sh/nvm, then open a fresh terminal. Verify with node --version and npm --version.
VS Code
Section titled “VS Code”No command - three moves I already know:
-
Open VS Code (Start menu on Windows; Spotlight
codeor Applications on macOS). -
File → Open Folder, and pick a folder I made earlier (e.g.
startupistan-practice). -
Press Ctrl + backtick (the
`key, top-left) to open the integrated terminal, and runpwd- it should answer with the folder’s path.
All three work → editor ready. Install reference: download from code.visualstudio.com, defaults throughout (Windows installer; drag to Applications on macOS; .deb on Linux).
VS Code extensions - the curated twelve
Section titled “VS Code extensions - the curated twelve”Extensions are where a plain editor gains its abilities. Installing all twelve takes ~10 minutes. The procedure, repeated twelve times:
-
Open the Extensions view - the four-squares icon, or Ctrl + Shift + X.
-
Type the extension’s name in the search box.
-
Check the publisher matches the one listed below - imitations of popular extensions exist, and the publisher line is my guarantee.
-
Click Install. Active in seconds, no restart.
| Group | Extensions | Why |
|---|---|---|
| Formatting & quality | Prettier, ESLint, HTMLHint, Code Spell Checker | Keep code clean; flag problems before I run anything |
| Web workflow | Live Server, Auto Rename Tag, JS (ES6) snippets | Speed up building pages - Live Server auto-refreshes the browser on save |
| Git support | GitLens, Git History | Who changed each line, and a browsable project history |
| Comfort & readability | Andromeda (theme), Material Icon Theme, Better Comments | The shared look, meaningful file icons, highlighted TODO/warning comments |
VS Code settings - the course five
Section titled “VS Code settings - the course five”Extensions give abilities; settings decide behavior. Open Settings with Ctrl + , (comma), use the search box, and set five things:
| Search for | Set it to | What it does |
|---|---|---|
format on save | tick Format On Save | Code tidies itself every time I save |
format on paste | tick Format On Paste | Pasted code adopts my formatting instantly |
default formatter | Prettier - Code formatter | Tells the two above which tool tidies |
minimap | untick Minimap: Enabled | Removes the tiny code-overview strip - more room, less noise |
telemetry | Telemetry Level → off | No usage data leaves my machine (Datenschutz hygiene) |
The browser (Chrome as default)
Section titled “The browser (Chrome as default)”Two checks: installed and current (three-dots menu → Help → About Google Chrome - it updates itself right there), and set as default (the honest test: click a link from outside a browser - an email, a PDF - and see if it opens in Chrome).
Setting the default: Windows - Settings → Apps → Default apps → Google Chrome → Set default. macOS - System Settings → Desktop & Dock → Default web browser. Linux - Settings → Default Applications. It only changes which app opens links; every other browser stays installed.
The GitHub account
Section titled “The GitHub account”Not software - an identity on the web, and in Course 05 it becomes the online home of everything I build. Verify: log in at github.com; seeing my dashboard is the whole check. Lost password? Use “Forgot password?” now, not mid-course.
The environment-readiness checklist
Section titled “The environment-readiness checklist”One sitting, run from the VS Code integrated terminal. A machine that passes all eight is ready for the whole block.
| # | Check | Pass looks like |
|---|---|---|
| 1 | git --version | Any version number |
| 2 | node --version | Any version number |
| 3 | npm --version | Any version number |
| 4 | Extensions (Ctrl + Shift + X) | The twelve are listed under Installed |
| 5 | Settings chain | const x=1; snaps to const x = 1; on save |
| 6 | Chrome | A link clicked outside a browser opens in Chrome |
| 7 | Hyper (macOS & Linux) | Opens and answers pwd |
| 8 | GitHub | I can log in at github.com |
Troubleshooting - the three patterns
Section titled “Troubleshooting - the three patterns”| Pattern | What’s really happening | The fix |
|---|---|---|
command not found right after installing | My terminal read its list of program folders when it opened, before the install added the new one | Fresh terminal first - close completely, reopen, retry. Reinstall only if a genuinely fresh terminal still fails |
| The installer won’t run / admin prompt rejects me | I’m on a machine where install rights belong to someone else (company/family device) | Human, not technical: the owner or IT enters credentials or installs it. Nothing should bypass that |
| An old version was already there | An install from years ago | Almost never matters here. If a tool misbehaves and my version is far behind, installing the current version fresh simply replaces the old one - that’s the whole upgrade |
Revision summary
Section titled “Revision summary”| Must-know | One-line recall |
|---|---|
| GUI vs CLI | Clicking vs typing; the terminal is the window where the CLI lives |
| Terminal vs shell | Terminal = the window; shell (PowerShell / Zsh / Bash) = the program inside that runs commands |
| Never type the prompt | The $, %, or > is the prompt - I type only what comes after it |
| The five-command rhythm | pwd (where) · ls (what’s here) · cd (move, .. = up) · mkdir (make) - check-move-confirm |
| Windows vs Unix commands | touch → New-Item in PowerShell; most others (ls, cat, cp, rm) alias fine |
| Silence = success | cd / mkdir say nothing when they work; confirm with pwd / ls |
| Reading errors | not found = typo/missing program · no such file = wrong folder · too many arguments = quote the space |
| The four tools | VS Code writes · Git remembers · Node.js runs JS (+ npm) · browser shows & inspects |
| Git vs GitHub | Git = the tool on my machine (offline); GitHub = the online home for Git projects |
| Node.js = runtime | Runs JavaScript anywhere, not just in a browser; brings npm (package installer) |
| DevTools is a sandbox | Inspect edits my local copy only; a refresh undoes it - safe to poke anything |
| Editor vs IDE | Editor = light + general, extend per need (VS Code); IDE = complete workshop for one ecosystem (ABAP later) |
| The golden rule | After every install: close the terminal, open a fresh one, then verify |
| Verify = any version | --version answering with any number is the pass - numbers differ on every machine |
| Node: choose LTS | Long Term Support = stability over novelty; what professional teams run |
command not found after install | Almost always a stale terminal - fresh terminal first (the PATH was read at open) |