MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

達人プログラマへの道

はじめに

この本は俗にいう

"スーパープログラマ"

と言われている人達のほとんどが

読むことを推薦している名著です.


素晴らしいプログラマになるための,

プラクティスをまとめたものであり,

出版が2000年と古いことから,

紹介されているツールは古いものがありますが,

基本的なプログラマの心構えや開発方法を学ぶことができます.


今回,この本の内容をまとめると共に,

その内容について実際に調べてみたり,

それを実現する方法をすこしづつアップデートしたいと思います.

プログラムの割れた窓をそのままにしない

これはつまり,

コードを読んでいたり,書いている時に

"ここは問題だな"

と思った所を放置するのは止めようということです.

以前書いた紹介したボーイスカウトルールに近い考え方ですね.

myenigma.hatenablog.com



これは非常に簡単なことだと思われますが,

メインの仕事をしている時に,

別のコードの問題を発見してしまった時など,

面倒くさいから,見なかったことにしようと

してしまいがちです.


しかし,

そのような小さな問題は

そこで放置されると,

時間とともに依存関係が複雑化し,

最終的には大きなバグとして

または大きなパフォーマンス低下の原因として出現し,

解決に非常に大きな労力を必要とします.


これを解決する方法として,

もし時間がなくてその小さな問題を解決できないと思ったら,

ソースコードの中にTODOコメントを残しておきましょう.

下記の記事のように,C++の場合

//TODO: 動的配列を静的配列に変更

のようにコメントを残しておくと,

開発環境がTODOのリストを作ってくれます.

プログラマーは、ソースコードにTODOを書こう。 - このブログは証明できない。


また,このように書かれたTODOコメントは

vimのvimrcに下記のように追加すると,

F3を押すことでリストを作成することができます.

"<F3> TODOを検索
noremap <F3> <ESC>:vimgrep /TODO/j **/*.cpp **/*.h **/*.py<CR>:cw<CR>


あとは,

一日一個とか自分でルールを決めて

そのTODOを一つづつ解決して行きましょう.


これはまさに

リファクタリングであり,

プログラミングにおけるGTDですね.

知識のポートフォリオ

プログラマにとって一番重要なものは知識です.

その一番大事な知識をまさしく運用するためには,

金融工学のポートフォリオ理論に従う必要があります.


1.定期的に投資を行う

この本では毎年一つの言語を習得し,

四半期に一冊の技術書を読むことを提案しています.

個人的には,毎年一つの言語は厳しいですが,

四半期に一冊の技術書は読みたいですね.

2.多角化

特定の技術だけでなく、幅広く学ぶということです.

ソフトウェアエンジニアはハードウェアも.

エンジニアは経理や法律,経営を

そしてビジネスマンは,哲学や文学,社会学を

できるだけ広く学ぶことで,

教養を身につけ,すばらしいエンジニアになれます.

3.リスク管理

ハイリスク(流行りの技術)と

ローリスク(普遍的な技術)の

両方をバランス良く学びましょう.

4.見直しと再配分

常に自分の学んでいる事柄を見直し,

自分の能力と立ち位置,

そして将来像と照らしあわせて,

学ぶ分野の再配分を行いましょう.


見栄えを良くする.

レポートやプレゼンなど,

伝えたいことがある場合,

話す内容や話し方も重要ですが,

同様に見栄えも重要です.


もし,同じ内容を伝えるのであれば,

かっこいい文書やプレゼン資料で伝えましょう.


かっこいい文書の作り方としては,

Wordでしたら,スタイルの使い方をマスターすること.

またはTexを使うことを考えましょう.

両方ともすでにあるかっこいいテンプレートを使うことで

かっこいい文書を作ることができます.

Word のスタイルの基礎 - Word - Office.com

TeX入門 - TeX Wiki


プレゼンの場合は,

Keynoteを使うことをオススメします.

またプレゼンで重要なグラフや図にも力を入れましょう.

GIMPやInkscape,Blenderのような強力な無料ツールを使いこなせば,

非常にかっこいいスライドを作ることができます.

Inkscape - ダウンロード

GIMP - The GNU Image Manipulation Program

Blender.jp - Blender Japanese Website


シンプルで効果的なプレゼンに関しては

下記の本がオススメです.

プレゼンテーションZEN 第2版

プレゼンテーションZEN 第2版



二重化を防ぐ

これは非常に当たり前ですが,非常に重要なことです.

同じコードを別々の場所に書くのは止めましょう.

片方を修正した時に,もう片方を修正するのを必ず忘れます(笑).

また二重化を防ぐことで,プログラムの見通しが非常によくなります.

単純に関数化することや,ライブラリ化することも効果的ですが,

コードジェネレーターを使用することも

二重化を防ぐ上で重要です.


プログラムの直交性を保つ.

できるだけ、プログラムの直行性を保つようにしましょう.

つまり,関係ないもの通しの影響をできるだけ排除するということです.

直行化ができているプログラムは

各モジュールだけをテストすればよくなるので、テストが簡単になります.



名言

言語の制約はそれを使う人の世界を制限する

ヴィトゲンシュタイン


UNIXコマンドを使って、日々のルーチンワークを自動化しましょう.

UnixとMacの場合,デフォルトでUnixコマンドを使うことができます.

Windowsの場合、CygwinかPythonで自動化するようにしましょう.


一つのエディタをマスターする。

高機能で拡張性のあるエディタを使用して,

使い方をマスターしましょう.

そして,

メールも、文章も、プログラムもそのエディタで書けるようにしましょう.



どんなものでもバージョン管理を行う。


プログラムだけでなく,

ドキュメントやプレゼン資料など,

どんなものでも,ある目的のために作成したものは,

バージョン管理をしましょう.

バージョン管理ソフトとしては,

Gitやsubversionがあります.


リファクタリング


リファクタリングはちょっとづつやりましょう.

あまり一気にやると,無数のバグが入り,

元の機能を復元できなくなります.

同様にバグをあまり入れないようにするため,

機能の追加とリファクタリングは同時にやらないようにしましょう.


リファクタリングを学ぶには、下記の書籍がおすすめです。

myenigma.hatenablog.com

 

すべての作業を自動化する。

我々よりも、

コンピュータの方がうまくやってのけるような繰り返しや俗っぽいことは、

すべてコンピュータに任せてしまいましょう。

我々にはもっと重要で難しい仕事が待っているのですから。

プログラムのコメントについて

ドキュメントは付け足すものではなく、組み込むものである。

一般的にコメントは何故それを行うかという目的やゴールを記述すべきです。

ソースコードへのコメントは、技術上のトレードオフ、意思決定の理由、

却下された代替案などプロジェクト資料の何処にも記述されていない難解なポイントを記述すべきです.

そのコードがなにをしているかは,コードを読めばわかるので,

コメントには書かないようにしましょう.



各モジュール(関数)の見出しもちゃんと書きましょう.

/* ====================================================================== */
/**
 * @brief  0以上max未満の範囲の乱数値を返す
 *
 * @param[in] max  範囲の上限+1
 *
 * @return  乱数(整数値)
 *
 * @note
 *   乱数の質を上げる為、特定の範囲の値を捨てている。
 *   comp.lang.c の C-FAQ 13.16 を参照。
 */
/* ====================================================================== */
static int random(int max)

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com