## Intro

Code Beauty / Project Beauty

by

Christoph Lohmann <[email protected]>

## Repetition: Bitreich Principles (0/6)

KISP – Keep It Simple Perfect

* Make one tool for one task.

* Keep the size of the tool small enough so one person can grasp it.

* Decide when the tool is done, then maintain it.
       * If you have some other idea, create a new project.

* Base the tool on principles.
       * This will allow the tool to be used in ways you cannot
         imagine now.

## Repetition: Bitreich Principles (1/6)

Commandline Interfaces

* This allows easy integration into scripts and any modern workflow.

* Pure GUI restricts your application to only certain users.

* You want expert users to get new ideas. Experts use the commandline.

## Repetition: Bitreich Principles (2/6)

When Possible Use GPLv3

* This is not a need.
       * Use BSD or MIT if you like.

* In the long run (A)GPLv3 allows getting changes from commercial criminals
 who do not give back.
       * This makes you sleep better.
       * You do not need to run around enraged and destroy your Linux
         distribution. (See Void Linux.)

## Repetition: Bitreich Principles (3/6)

Users Are Programmers

* Always think of programmers seeing your code and wanting to modify it.

* See programmers who would like to use some flag in the API.

* See the person who would like to help you with changing a typo.
       * If you use some cumbersome documentation format, noone will
         easily learn it.

* Programmers have a certain lifetime to expend too.
       * Do not force down their throat your new overcomplex hipster
         language.

## Repetition: Bitreich Principles (4/6)

Bugreports Are Patches

* If you write a tool for programmers, expect them to be programmers.

* If you really write for end users, then the error reporting should not
 be a bug report, something simpler.
       * The bug report culture is not easy to grasp and different to
         the normal world.

* Bug reports are for mediocre programmers.
       * Force people to become better programmers, let them send patches.

## Repetition: Bitreich Principles (5/6)

Straightforward Documentation

* Make one entry point to the documentation and keep to it.
       * README
       * Manpage
       * Source Code

* Do not use some nice looking but not easily accessible documentation.
       * A web browser is required to view the doc?
               * javadoc?
       * GNU info pages anyone?

## Repetition: Bitreich Principles (6/6)

Freedom of Language

* Use whatever you like, but keep to the other principles.

* Many languages force you into ugly behaviour.

* Keep to the Code Beauty.
       * This is what this talk is about.

* This list is not complete.

## Beauty Disclaimer

* This is my view on beauty.

* Beauty is in the eye of the beholder.

* Everyone has a different view on beauty.

* There is never one definition of beauty.

## How I Evaluate Project Beauty (0/4)

1. Download

       % git clone git://something
       % hurl gopher://something/some.tar.gz

* NOT

       % curl -sLy --with-root --with-kubernetes startup.io/install.sh | sh

* NOT

       > Click on hidden button on website.
       > Agree to NDA.
       > Wait for Redirect.
       > ...

## How I Evaluate Project Beauty (1/4)

2. Extraction

       % tar -xzf some.tar.gz

* NOT

       % ./install.sh

* NOT

       > Manually install requirements for huge stack of software.

## How I Evaluate Project Beauty (2/4)

3. Compilation

       % make
       # See options by reading config.mk.

* MAYBE

       % ./configure --prefix=/usr --some-option
       % make

* NOT

       % ninja-my-ass
       Command not found: ninja-my-ass
       % emerge ninja-my-ass
       Building package ninja-my-ass required 102 dependencies and a Ruby
       upgrade. Please upgrade the whole system.

## How I Evaluate Project Beauty (3/4)

4. Dependencies

       % make
       # Done

* NOT

       % ./configure --prefix=7usr --some-option
       Specific version of mesa is required to build this. Newer versions are
       not supported.

* NOT

       % make
       Perl is required to build a small example script. Please install perl.

## How I Evaluate Project Beauty (4/4)

5. Running It

       % ./app -h
       % ./app -f something -c something

* NOT

       % kubectl apply -f cat-with-highlight.yaml
       % kubectl get pods
       % catctl attach -s localhost run cat


## How I Evaluate Code Beauty (0/2)

* Different languages have different ideoms.

* Things that make me not use a language:
       * »::«
       * »<someclass,<someclass>>
       * »Type<&Something>«

* Simple language syntax can be uglified too.
       * See python and newer syntax.

* Make it easy to find modules/includes.
       * Even C is bad here sometimes.

## How I Evaluate Code Beauty (1/2)

* Did the developer think of other developers reading it?

* Please use English everywhere.

* Do not use paths to modules.
       * The java way of sub directory of sub directory is wasting
         lifetime.

* Do not depend on some GUI with auto generation.
       * If something needs auto generation it should die and never
         be used again.

* Always ask yourself: Can I sleep good at night for the code I
 produced?

## How I Evaluate Code Beauty (2/2)

* Do not depend on ugly libraries, just because it is cool.
       * Think of the many years lifetime wasted to build boost, but
         it never boosted anything.

* Think of small devices, which cannot compile in libreoffice to
 generate your documentation.
       * The big ugly to compile projects make distributions a hell
         to maintain.
       * If you do not care, you do not care about open source.

* See open sourcing something as a chance.
       * Corporated locked-in source is most of the times ugly and
         not easy to maintain.
       * By open sourcing you change the perspective to think of the
         next programmer reading this.

## See The Beauty In Others

* This was my view on thing.

* There are many views.

* The real beauty is, if something is seen as beautiful by others.
       * Think of the others when writing code.
       * Think of the others when packaging something.
       * Think of the others when you add some dependency.
       * Think of your future self having to maintain what you have
         just done.

## Questions?

Do you have any questions?

## Thanks!

Thank you for listening!

Send any comments to:

       Christoph Lohmann <[email protected]>