---
# System prepended metadata

title: Topic 16 - 18
tags: [The Pragmatic Programmer]

---

# Topic 16 - 18
###### tags: `The Pragmatic Programmer`
## Topic 16 The Power of Plain Text
> Look at your raw materials, the stuff you’ll be shaping.

#### :star2: The best format for storing knowledge persistently is plain text.

### WHAT IS PLAIN TEXT?
*Plain text* is made up of printable characters in a form that conveys information.

We like our plain text to be *understandable* to humans

:::info 
Keep Knowledge in Plain Text
:::

### THE POWER OF TEXT

Plain text doesn’t mean that the text is unstructured.

e.g. HTML, JSON, YAML

e.g. the fundamental protocols on the net: HTTP, SMTP, IMAP

#### **👍 good reasons**

1. **Insurance against obsolescence**

    Human-readable forms of data, and self-describing data, will outlive all other forms of data and the applications that created them.

    :::info
    All software becomes legacy software as soon as it’s written.
    :::

    e.g. the difference between ***human readable*** and ***human understandable***

    Consider a data file from some legacy system that you are given.

    All that’s important to you is that it maintained a list of clients’ **Social Security numbers**, which you need to find and extract.

    👍 human readable and understandable 


    ```js
    <FIELD10>123-45-6789</FIELD10>
    ...
    <FIELD10>567-89-0123</FIELD10>
    ...
    <FIELD10>901-23-4567</FIELD10>
    ```

    👎 human readable but **not** human understandable

    ```
    AC27123456789B11P 
    ...
    XY43567890123QTYL 
    ...
    6T2190123456788AM
    ```

    👍👍 makes this task a no-brainer

    ```
    <SOCIAL-SECURITY-NO>123-45-6789</SOCIAL-SECURITY-NO>
    ```

2. **Leverage existing tools**
    - File comparison tools
        - see at a glance what **changes** have been made: `diff` and `fc`
        - generate a **checksum** to **monitor** the file for accidental (or malicious) modification: `sum`

3. **Easier testing**
    
    If you use plain text to create synthetic data to drive system tests, then it is a simple matter to **add**, **update**, or **modify** the test data ***without having to create any special tools to do so**.*
    

### LOWEST COMMON DENOMINATOR

In heterogeneous environments the advantages of plain text can outweigh all of the drawbacks.

You need to ensure that all parties can communicate using a common standard. **Plain text is that standard.**

---
## Topic 17 Shell Games
> How can you use your computer to get the most out of the tools you use?

#### :star2: For a programmer manipulating files of text, that workbench is the command shell.

A **benefit** of GUIs is **WYSIWYG**—what you see is what you get. The **disadvantage** is **WYSIAYG**—what you see is *all* you get.

:::info
Use the Power of Command Shells
:::

### **A SHELL OF YOUR OWN**

> A developer should customize their shell.

Common changes include:
- ***Setting color themes.***
- ***Configuring a prompt.***
    Personal preferences are everything here: we tend to like simple prompts, with a shortened current directory name and version control status along with the time.
- ***Aliases and shell functions*.** 
    Simplify your workflow by turning commands you use a lot into simple aliases.
- ***Command completion*.**

- zsh: https://ohmyz.sh/

---
## Topic 18 Power Editing
> Suggest ways of making you more efficient.

You need to be able to manipulate text as effortlessly as possible, because text is the basic raw material of programming.

:::info
Achieve Editor Fluency
:::


### **WHAT DOES “FLUENT” MEAN?**

What counts as being fluent? Here’s the challenge list:

- When editing text, move and make selections by character, word, line, and paragraph.
- When editing code, move by various syntactic units (matching delimiters, functions, modules, ...).
- Reindent code following changes.
- Comment and uncomment blocks of code with a single command.
- Undo and redo changes.
- Split the editor window into multiple panels, and navigate between them.
- Navigate to a particular line number. Sort selected lines.
    - `Ctrl + G`
- Search for both strings and regular expressions, and repeat previous searches.
- Temporarily create multiple cursors based on a selection or on a pattern match, and edit the text at each in parallel.
- Display compilation errors in the current project.
- Run the current project’s tests.


You might say that your current editor can’t do some of these things. **Maybe it’s time to switch?**


### **MOVING TOWARD FLUENCY**

Look at yourself while you’re editing. 

Every time you find yourself doing something repetitive, get into the habit of thinking “there must be a better way.” Then find it.

- [keyboard-shortcuts-macos.pdf](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf)

**Growing Your Editor**

When you bump into some apparent limitation of the editor you’re using, search around for an extension that will do the job.
![](https://i.imgur.com/3TjRu05.png)

### useful git command
- `checkout -` / `switch -`: return to previous branch

![](https://i.imgur.com/bd2Zvba.png)
