Empowerment Engineering

内発的動機づけをソフトウェア開発の力で支援する

特定領域の習熟に関する一例としての自分の人生を振り返る

f:id:tbpg:20161001222936p:plain

特定領域に関する人の成長例ということで
自分がシステム開発を上達していった過程を思い出してみる。

興味

大学時代。知人の紹介でフリーランスプログラマをしている人のもとで
システム開発の雑務をお手伝いすることになる。
このときはじめてプログラミングを知る。
1998年頃かな。

PowerBuilder を使ったGUIの開発をした。
GUIでフォームの部品を配置して各部品のイベントとして簡単な処理を書く程度のもので
プログラミングといえるようなレベルのものでは無かったが、私にとっては興味深く魅力的なものに映った。

道具

同じく大学時代。プログラミングを知ったあと。

趣味のゲームの攻略サイトを作成するためにHTML+CSSでホームページを作った。
その流れでちょっとしたJavaScriptも取り入れた。
サーバーサイドの処理はありもののCGIを使わせてもらうだけだった。
アクセスカウンタや掲示板など。

テレホーダイとかキリ番とかテキストサイトとか古き良きインターネットの時代。

就職活動

文系だったが、アルバイトやホームページ作成をきっかけにプログラミングが好きになり、
プログラマーになることを決める。
就職のために何を勉強すればいいかよくわからずに初級システムアドミニストレータを取得。

この時期は就職氷河期ではあったが、イントラネット内で利用するWebシステムの開発需要が多く
あった関係で受託開発の会社でさくっと採用される(ブラックだったけど)。
大学内で1番最初に就職が決まり、事務の人に報告したら驚かれた記憶がある。

研修

入社前研修としてLANケーブルの自作、C言語によるシンプルなプログラムの課題、UNIXの基礎をやった。
UNIXの基礎については、配属チームの関係でこの研修の記憶はほぼなくてあまり意味がなかった。
C言語もその後一切利用することがなかったが、ほとんど基礎を知らない状態で初歩的なプログラムを作成する経験は
役に立ったのだろうと思う。
自分なりにアルゴリズムを考えて、C言語でどう実現すればいいかを調べて、実際に実装して、想定通り動かなければ原因を調べてなおす。
そういうことをやった。

OJT

2000年。

入社直後に本を数冊与えられて新人4人だけで社内の勤怠システムを作ることになる。
IIS, ASP, VBScript, Oracleの構成。
メンバーは全員プログラミングの初心者。プロジェクトリーダーを担当する。
個人で多少なりともプログラムを触っていた私が1番多く手を動かす事になった。

  • システムの仕様をチームのリーダーにヒアリング
  • 設計
  • 開発
  • テスト

途中DBの変更(OracleからSQL Server)などもありつつ2ヶ月程度で完成させた。
実運用も担当し、導入支援や各所からの問い合わせに応じた機能改修も行った。
これは今思い出しても中々よい経験だったなと思う。

はじめての会社

方眼紙から始まるキャリア

勤怠システムの開発終了後、実際のプロジェクトに参加することになる。
最初はテストのみ。いわゆるExcelスクショペタペタと納品用のテスト仕様書類を作ること。
おそらく次フェーズで開発に参加するための仕様の理解を兼ねての雑用だったのだろう。

ひたすらExcel方眼紙とじゃれあった。
この頃はまだ何が効率的で何が非効率かという自覚はなくExcelのショートカットを覚える程度の効率化をしつつ、
アナログにテストを実行し、アナログにスクショをとり、アナログに資料を書いていた。

開発デビュー

この時期には試用期間が終わり、途端に毎日終電コースになった。よって個人で勉強をする時間はなくなった。

テスト終了後、次フェーズの開発にアサインされる。
単体レベルの機能の設計・開発・テストを担当する。
開発時は紙に印刷して行レベルでのレビューをしてもらった。この時自分のメンターが社内で1番レベルの高い開発者
だったのはとても運がよかったのだろう。

いわゆる「人の助けがあれば動作するプログラムを作ることができる」といえるぐらいのレベルになった。

黙々と実務

その後、各種プロジェクトでサブシステム1つ分の開発を担当するなど必要な業務を通してひたすら数をこなした。
ただし、全体にまたがるような設計や運用サーバーや環境構築に関するようなことは一切経験しなかった。
そのためプログラミングに関わる工程とそれに関わる設計・テストのドキュメント周りの経験だけを毎日終電まで行なった。

たまに単発でちょっと変わり種のツール開発やBIツールの技術検証、導入支援などを一人で担当した。
一人で何かを調べて、実際に作ることについてはある程度認められていたのかもしれない。

2年目には1人の新人のメンターを担当することになる。
そして2年目が終わった頃に心身が限界を迎えて退職。

この会社ではプログラムの品質や生産性について学ぶ機会はなく、
ただひたすら長時間を使って要件を満たすプログラムを開発することを学んだ。

ASPVBScriptによるWebシステムの開発がどんなものか想像がつかない人は
ビューにHTMLとCSSJavaScriptとサーバーサイドのプログラムのすべてを埋め込む感じのやつを想像してもらえば
伝わるかな、と思います。
RubyならビューのerbやHAMLの中にサーバーサイドのロジックも全部書く感じ。

多重派遣時代

まともな準備も経験もないまま転職したので多重派遣の末端企業にしか転職できなかった。
このときも基本的には激務だったが、点々とする派遣先によっては最初に入社した会社よりは多少早く帰宅
することができたので時期によっては書籍+PCで自分なりに知識の幅を広げていった。
派遣先には一人で行き、元受けや他のシステム開発者のメンバーとの開発をした。
以降、派遣系の現場にいる間は誰かから何かを教えてもらうという機会はほぼなかった。

低迷期

開発フェーズで人不足の現場の詳細設計フェーズで参加し、設計書を書いて、実装をして、テストをして、
納品直前ぐらいに離脱する、というように派遣先のプロジェクトを転々とする。

スキルとしては転職前と同様に単体レベルの設計・開発・テストしかやっていなかったのであまり伸びてはいない。
新たに得た経験としては

  • 色んなシステムの既存コードを読んで理解する
  • 色んなシステムの業務を素早く理解して実際に手を動かせるようになる
  • 色んな開発チームのルールを理解して開発体制についていけるようにする

というのを3-6ヶ月ぐらいの間隔で繰り返したことくらいか。
この間あまり実力は伸びていなかっただろう。

改善の原点

そんなこんなをやっているうちに、個人学習した内容を活かす機会があった。

b.hatena.ne.jp

ここが自発的な改善提案の原点だと思う。
提案して実行して大きなインパクトを与える事ができることを知った。

以降、つらみのある派遣現場にいながらも自分が学習して知っている部分に関しては
提案して、実際に手を動かして、改善するということをするようになった。

ドロップアウト

しかし結局どこに行っても激務だったこともあり業界から足を洗った。

変わり種

しばらくの休養を経て小さな映像制作の会社で事務・雑多な雑用をしながら細々と暮らしていた。
事務用品の発注をしたり、請求書の作成発想をしたり、経費をまとめたり。
プログラミングはしなかったがデザイナーさんからもらった素材をもとにランディングページの作成程度のことはやった。

社長が商談をしていたり、ビジネスの現場でどんなことが起こっているかという全体像を横目でみていた。
自分にとっては「社会人としてのリハビリ期」だったのだが、この経験は地味にきいているのだろうと思っている。
通常システム開発の開発担当だけをやっているときには見ることができない部分をみることができた。

ある程度元気になってくるとともに年齢もあがってきて誰でもできる事務のお仕事ばかりしていられないな、
ということと向いてないということもあり、結局システム開発の仕事に戻ることにする。

多重派遣時代再び

まともな経歴がないし、まともな学習もしていない状態で、まともな場所に行けるわけもなく結局多重派遣の末端に舞い戻る。
この時期にブランク解消のためにはじめた勉強をする習慣が以降ずっと習慣化した。
これにより仕事は同じことの繰り返しでも個人的に成長する機会を得ることになる。

同一コンテキスト別展開

以前の「低迷期」とほぼ同じ状況で開発を行う。

ただ、「個人で継続して勉強している」という点が以前とはことなる。
個人で学習した内容を元により良いやり方について提案実践を行っていった。

  • Redminの導入をしたり
  • JUnitの導入をしたり

とか。
結果としてだんだんと自分の周りに今までより難易度が高い仕事が増えていくことになる。

周りの多重派遣の人やフリーランスで案件に参加している人は一切個人でプログラムの学習などはしていない
人がほとんどだったので、「やれば差がつく状態」だっということを今から見ると思う。

気がつくと開発チームのリーダー的なことを任されるようになっていた。

SIあるある

ある程度できるようになると開発担当から外れていく、という展開に陥ってしまった。
上流のドキュメントを書いたり、ひたすらバグ管理システムをポチポチするという生活になってしまう。

もっと開発経験を積みたかった私は「Rubyの開発ができる現場に転職したい」とツイッターで呟いていた。
そのつぶやきをきっかけにTwitterでスカウトされて転職した。

自由

大きな粒度でタスクを与えられ、求められる成果物ができあがるならやり方は問わない。
ただし、できるだけ生産性の高い方法でやること。
新規の技術の採用も必要性が理解できれば迷いなく行う。

そんな感じの現場に転職した。

ほぼ残業なしなので学習時間もたっぷり得た。
ほぼ毎日業務内外で新しいことを覚えながら現在過ごしている。

サイドプロジェクト

CodeIQの出題者へのスカウト。
副業のお誘い。
そういった機会を得て、ここ数年は本業以外でも多用な経験を積む機会を得ることができた。

  • 挑戦者さんのことを考えて自分一人ですべてを企画し、手を動かす出題者の仕事
  • Webサービスの開発に関わるいろんなことを経験する副業

情報会議 への参加も刺激になった。
自発的に何かに取り組む社外の優秀な人達と一緒に何かをするということは貴重な経験だった。

分報仲間も学習・成長の要素としては欠かせない。

tbpgr.hatenablog.com

自発的に何かに取り組む社外の優秀な人と毎日やりとりをしている、というのは物事の考え方を知る上で
とても有益だ。やる気の好感をする意味でも。

まとめ

自分の上達の過程をまとめてみた。
新卒で多少レビューをしてもらった以外はほとんど他人に介入されずに一人で上達してきている。
もちろん見て盗む、的な面としてはある程度他の人の影響も受けているとは思うけど。

基本は

  • 好奇心に任せて自分で学習する
  • 必要にかられて自分で学習する
  • 周りの人の考え方からヒントをもらい自分で学習する

ということか。
結局は自分の場合の成長の鍵は

  • 十分な時間を持つ
  • 十分な裁量を持つ
  • 好奇心のきっかけを得る
    • 日々の情報収集
    • 関わる人、場所を増やす
  • 必要にかられる
    • 解決したい現実の課題を持つ
    • アウトプットやお出かけを機に外からの機会を得る

ということになるのかな。
みなさんはいかがですか?