道草道

大崎上島での移住の記録(2016年4月~):子育て・古民家改造・裏山開拓・造船所・たまにプログラミング

島のプログラマー日記 10年越しのリファクタリング

指を怪我して仕事にならないので、昨年一年取り組んだリファクタリングプロジェクトについてロコタビテックブログに書きました。

 

note.com

 

そもそも、リファクタリングに興味を持ったのが約10年前。

このブログを、そもそも書こうと思った理由もレガシーコードのリファクタリングがなかなか上手くいかなかったからなんですよね。

 

legacycode.hatenablog.com

 

10年の間に、

島に移住して、

プログラマーは一旦やめて、

3年くらい造船や養殖業をして、

やっぱり、プログラマーに戻ってと、紆余曲折がありました。

 

まだまだですが、ようやく、ある程度はちゃんとリファクタリングができた気がします。

変化が早いと言われるソフトウェアの世界でも、根本的な部分って10年前の今も変わらないんですね。

 

ソフトウェアがちゃんと作れるようになったと言えるのはいつになるんだろうな〜?

後、10年くらいやったら何かわかってくるのだろうか??

10年後は、54歳なので、まだ、じいちゃんプログラマーではないな。

20年後の、64歳は、じいちゃんプログラマーか。

その時、プログラマーって職業存在するのだろうか?

先のことは分からないですが。

 

ちなみに、指はブログ書ける程度には回復してきました。

島のプログラマー日記 複雑な変更をして、バグが出るのは、何か根本的に間違っているのではないか?という話

先週、指を結構怪我してしまって、今週は半休業中です。

 

先日、同僚のソースコードの修正をレビューして、大変言いにくかったのですが、そのPRは却下して、意味のある単位に分割して新しくPRを作るようにお願いしました。

 

話し合って、納得はしてもらったのですが、なんか伝えきれなかったなとの、もやもやが自分の中に残ったので。

 

その時思ったことが、

複雑な変更をして、バグが出るのは、何か根本的に間違っているのではないか?

 

複雑な修正や、大規模修正したら不具合がでても仕方ないみたいな雰囲気を感じることがあります。

前職が、絶対ミスをしてはいけない工場のオペレーションなどの仕事をしていて、Web業界に転職したので、余計にそう感じるのかもしれないです。

もちろん、どんなに注意しても人がすることなので不具合は出るんですが、不具合出るのって、不具合出るような仕組みから、不具合出るんじゃないか?と思ったりします。

 

ように見える

却下したPRの修正に関してですが、印象として、コードの修正もまずくないように見える、仕様も外してないように見える

ただ、修正箇所が多くて、本当に正しい修正なのか確信を持てる自信がない。

これは、レビュアーの力量の問題もあると思う。(つまり自分の力量)

1つのPRに40ファイルの修正は、多いといえば多いが、そんなに無茶苦茶というわけでもないかもしれない。

「ように見える」の理由として、リファクタリング、機能追加、機能の修正がごちゃっと一つのPRになっている。

 

それぞれの変更は、それぞれ正しく見える、でも、「ように見える」から、全体として、これは正しいへの確信が持てない。

時間をかければ確認できなくもなさそうだけど、レビューの焦点がブレてしまって、「ように見える」を抜けきれない。

 

と、つらつら書いていて、ネット上で情報ないかとググったら、同じように思っている人は結構いた。

 

「巨大プルリク1件vs細かいプルリク100件」問題を考える(翻訳)|TechRacho by BPS株式会社

 

粒度を小さくする

「小さく」というのは、限りなくゼロ行に近づけるということです。たった1行の変更のレビューを嫌がるレビュアーはいないでしょう。プルリクのサイズ(=コードの行数)に上限を設けることで、粒度を下げやすくする効果が著しく向上します。レビュアーが1行ずつ精査しやすくなるのはもちろんのこと、レビュー時間も大きく削減できます。コードを定期的にマージできるようになり、品質にも自信を持てるようになります。

作業のスコープを絞る

コードの行数を削減するための重要なコツは、プルリクのスコープ(=機能のセット)を絞り込み、解決するタスクを1つにする(または密接に関連する少数のタスクに絞り込む)ことです。スコープを絞ることで、レビュアーの認知機能にかけられる負荷を大きく軽減できます。1件のプルリクでいくつもの問題をいっぺんに解決しようと欲張ると、ある問題がどのコードと関連しているのかを整理する作業がつらくなります

「ついでのリファクタリング」はしないこと

開発者は、問題に気づくとその場でリファクタリングすることがよくあります。もちろんリファクタリングはよいことですが、別のプルリクで行うべきです。そうすることでリファクタリングを早めにマージできますし、関係のない機能リリースに修正が押し込められることもなくなります。「ついでの改善」は、元々のプルリクのリリースが遅れれば巻き添えで遅れてしまいますし、最悪まったくリリースされなければそのまま失われてしまうでしょう。

 

複雑なものを複雑なまま扱うことで見えなくる

 

どんなに複雑なものも、分解すれば単純な構造に分解できます。

当たり前なんですが、複雑なものを複雑なまま取り扱うと、複雑です。

複雑な修正をレビューしても、やっぱり複雑なので、見逃してしまう不具合も増えます。

 

複雑なものを分解して、意味のある最小単位に分けるのは確かに手間もかかるし、難しいことも多いです。特に元の設計が悪かったりすると尚更。

 

でも、単純なものはレビューするのも簡単で、当たり前ですが、不具合にも気がつきやすいです。

 

他を壊さない作業の境界を見つけるには、The Mikado Methodがおすすめです。

日本語に訳されていないのが残念ですが、今の時代DeepL様のおかげで余裕で読めます。

The Mikado Method (English Edition)

 

複雑な変更をして、バグが出るのは、何が根本的に間違っているのか?

何が根本的に間違っているのか?

「複雑な変更」という時点でアウトの可能性が高いということだと思います。

 

  • 複雑なものを複雑なまま扱わないで、単純な形に分ける
  • レビューを機能させるには、複雑かどうかの基準はレビュアーのレベルに合わせる必要がある

 

そんなところかな?

自分の安全圏内で、冒険することのススメ

海外青年協力隊、育児時短勤務、島への移住、リモートワーク、これらの人生の出来事を並べると、自分の行動パターンに気がつく。

 

将来起こるだろう不安に対して、本気で追い込まれる前に、安全圏内でプチ破綻を実験している感じ。

 

海外青年協力隊時は、30代目前だった、気ままにしていたらよかった新人時代が終わり、リーダー的な役割やプレゼン能力が求められてきているの感じていた。

国の制度を使って、安全な環境で自分のアップデートを試していた。

 

育児時短勤務は、連れ合いと二人の世界から、子供いる生活になって、家事や生活がどう変わるか知っておく必要があると思った。

会社の制度を使って、子育ってどんなものか経験してみた。

 

島への移住、リモートワーク は、これから起こるかもしれない未来のシミュレーションに近い。

これから起こる人口減、会社の倒産などに、本当に巻き込まれる前に、まだ、若くて余力のあるうちにプチ体験している感じかもしれない。

今なら、もし、失敗しても街に帰ればいいだけなので、最低限の安全は確保されている。

 

これが、子供が大きくなってお金がかかるようになり、家のローンも組んでいて、そんな状況で起こったと想像すると、恐ろしくて仕方がない。

 

島への移住、リモートワーク へのチャレンジを通して、自分の市場価格、家族が幸せに暮らせる最低限の収入、自分にとって幸せって何だろうかとか、色々と分かったことがあった。

 

未来なんて予想できるわけないのだけど、一番、不安に思っていることのプチ体験が予めできるのなら、さっさと体験して、次の不安に備えた方がいい。

当初想定していた理想型。リモートワーク と鉄工所の二足わらじ

島に来るとき、リモートワーク で生活費の7割がたを稼げて、残りを島の産業で稼げたらなぁと、思っていたのですが。

 

結果的に、来年からそうなることに。

 

リモートワーク 

 

リモートワーク 先は、トラベロコ。

traveloco.jp

来年度より週3日の稼働予定。

完全フルリモートです。

 

1ヶ月インターンを経験しましたが、出社しないと言うのはとても不思議な感じです。

コアタイムも特になく、いつ働いでもOK。

働いている人も、ベトナムに開発部隊がいて、ポーランド、沖縄、名古屋、日本中に点々とエンジニアが散らばっている感じ。

想像していた以上の自由さ加減です。

 

でも、物理的束縛がないと言うことは、目に見える成果は、自分がWeb上に残したソースコードの活動履歴だけです。

怖いと言えば怖い世界。

自分がどんなプロセスで仕事を進めていて、今、どんな状態か、ちゃんと伝えないと、何もしていないと思われても仕方ない。

 

ほんと、Rubyのような会社。

Rubyは君を信頼する。Rubyは君を分別のあるプログラマとして扱う。
Rubyメタプログラミングのような強力な力を与える。
ただし、大いなる力には大いなる責任が伴うこと忘れてはいけない。

Matzのことば

 

もし、限りない自由とセルフマネージメントを希望するなら、まだ、募集中みたいです。

 

www.wantedly.com

島の鉄工所

耐火煉瓦金枠の事なら「惣明製作株式会社」

 

リモートワーク だけでは、生活費に足りないので、あと少しどうしようかと考えていたところ、

 

日本一仕事も遊びも楽しくできる会社を目指します‼️
週に2日でも大丈夫ですよ‼️

 By 惣明製作所社長

 

と言うことで、週2日は、島の鉄工所で働くことに。

ここの社長さん、鉄工所以外にもマリンレジャーもやっている楽しげな会社。

www.skymarine.jp

 

他にも居酒屋、それから色々企んでいるらしいです。

 

この島に来てから、ITを使って現場を楽にできないかな?

と、ずっと、思っていました。

 

ただ、正社員として働いてしまうと、現場の忙しさに巻き込まれてしまって、なかなか、改善にまで手を出すことができなかった。

週2日で、現場に入りながら、現場にITを上手くはめ込めないかと思ったりしています。

 

惣明製作所も求人募集中らしいです。

島に移住しようと思って、職を探している方は、リモートワーク でも島の鉄工所でも、選びたい放題ですよ〜。

 

そう言うわけで、来年からの農的暮らしリモートワーク と鉄工所ライフの2本立てでお届けできればと思います。

 

本当の意味で、人を楽に楽しくするためにIT技術を使いこなせるようになれれば、と思っています。

 

新しい大崎上島ライフの幕開け。

f:id:legacyCode:20181221183245j:plain

 

僕はこうやってリモートワーカーになった。リモートワークへの道

この6月からリモートワーカーを目指して、一人で黙々と学習してきたのですが、

どれくらい勉強していたのだろうかと思って、表にしてみた。

 

  6月 7月 8月 9月 10月 合計
日数 19 18 24 24 26 111
学習時間 65.0 84.5 133.0 126.7 128.1 537.3
平均時間 3.4 4.7 5.5 5.3 4.9

 

 

日数は、その月に勉強をした日数。

学習時間は、月での合計学習時間(h)

平均時間は、勉強した日での平均した1日あたりの学習時間。

 

1日平均、5時間くらい。

土日は、家族優先でという感じ。 

 

ネットで調べたら、一般的なプログラミングスクールの基礎からアプリケーション開発までのカリキュラムは200時間らしい。

 

プログラミングの習得期間って実際どれくらい?初心者から身につけた経験者が答えます | Travewriter

 

それでいうと、トータル537時間は、まあまあな時間。

 

ちなみに、制御系のC、C++のプログラミングは10年くらいのキャリアはある。

島に来る前に、時間があったのでWeb系のプログラミングスクールには通っていた。

2年間触っていないので完全に忘れていたけど、雰囲気はなんとく分かっていた。 

 

心がけていたこと

 

無理せず楽しめる、一生やり続けることができるペースで淡々とやる。

リモートワーク しか目指していなかったので、セルフマネージメント。

早寝早起き、生活のリズムを崩さない。

人は自分のペースでしか成長できない。(和田卓人さんがどっかで言っていた気がする言葉)

 

毎日したこと

 

座禅(朝・晩)30分

体が固すぎて、座卓に10分と座ってられなかったため。

余計な雑念を払う、焦りで空回りを防ぐ、頭をクリーンにして寝るため。

 

勉強モードになるためのコツ

 

自分のやる気スイッチはタイマー。

とりあず机に着いたらタイマースタート。

子供にも効いたけど、自分にも効く。

legacycode.hatenablog.com

 

 

実際にしたこと

 

ソニックガーデンさんのTryoutを受けていて、基本的にはそれをペースメーカーに進めていました。

参加・採用までの流れ - SonicGarden 株式会社ソニックガーデン

大体の会社が経験のあるエンジニアを面接だけで採用しようとするのに対して、初心者でも誰でもやりたい人は、ある一定以上の課題をクリアすれば面談して相談に乗りますという、誰に対しても間口を開いているスタンスは、Webエンジニアとしての経験がゼロの自分としては、とてもありがたかったです。

 

課題も会社が、何を重要視しているかよく分かって、良い課題だったと思います。

自分は、採用にはならなかったのですが、リモートワーク 本気で目指しているなら、一度受けてみる価値はあると思います。

 

リモートワーク しか考えていなかったので、学習もセルフマネージメント。

基本的には、書籍で独学。

書籍は、Tryoutで勧められていたものや、独自チョイスなど。

 

6月 HTML基礎、Web基礎、JavaScript基礎な本6冊

HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
 

まあまあ。

 

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

 

とてもいい本。

 

実践 Web Standards Design ~Web標準の基本とCSSレイアウト&Tips~

実践 Web Standards Design ~Web標準の基本とCSSレイアウト&Tips~

 

文字が多いけど、いいような気もする。

 

入門すぎてあまり。

 

 JavaScriptめんどくさって思った。

 

7月 Rails入門、Ruby入門、Git入門 5冊

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング

 

まあまあ。

 

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

 

 あんまり。

 

独習Git

独習Git

 

入門から仕事レベルまでかなりオススメ。

 

 かなりオススメ。

特に他言語をしていてRubyなんじゃ?って思った人にはオススメ。

 

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

有名サイトですが、相当オススメ。

スクール行かなくてもこれで十分ではと思う。

 

8月 Rails入門、Webセキュリティ入門、Git入門、Rspec入門

 

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

 

Railsチュートリアル2回目。

1回目は、とりあえず終わらす。2回目は、もう少し理解して終わらす。

 

 

 良い本だと思うが、分厚い。

 

独習Git

2回目。一回やっても完全に忘れてしまっていたので。

やっぱり、オススメ。

 

Read Everyday Rails - RSpecによるRailsテスト入門 | Leanpub

Rspecの雰囲気を掴むためには、オススメ。

 

 

9月 Ruby基礎固め、Rails基礎固め、HTML基礎固め、JavaScript苦手克服

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)

Ruby入門2回目。やっぱりオススメ。

 

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

 

Rubyって、分かったようだけど、なんだか掴みきれていない気がする人にオススメ。

C言語で、ポインタが分かった時の感覚に似ている。

 

 

HTML5+CSS3の新しい教科書 改訂新版 基礎から覚える、深く理解できる。〈レスポンシブWebデザイン対応〉

HTML5+CSS3の新しい教科書 改訂新版 基礎から覚える、深く理解できる。〈レスポンシブWebデザイン対応〉

 

 結構分かりやすかった。

 

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

2回目だけど、全然頭に入らない。JavaScriptは掴みどころがなくて苦手。

 

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

Railsチュートリアル3回目。

Rspecでテストを書いてみる。オススメ。

 

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

2回目。やっぱりいい本。内容は結構忘れていたけど。。。

 

とても良い本。

自分が全然オブジェクト指向を理解していなかったことに愕然とする。

 

Effective Ruby

Effective Ruby

 

今の自分には、レベルがあっていなかったかな?という感じ。

 

 10月 実戦に向けての準備

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)

3回目。理解が曖昧な部分を中心に。やっぱりオススメ。

 

メタプログラミングRuby 第2版

2回目。Rubyが面白くなってくる。オススメ。

 

Read Everyday Rails - RSpecによるRailsテスト入門 | Leanpub

Rspecを実践で使うために。やっぱりオススメ。

 

テスト駆動開発

テスト駆動開発

 

テストはちゃんと書けるようになりたかったので、昔何度か読んだけど、読み直す。

オススメ。

 

Rubyによるデザインパターン

Rubyによるデザインパターン

 

C++デザインパターンやった時は、めんどくさいだけだったけど。

Rubyですると全然雰囲気が違う。

無駄なコードがないのでパターンがすっと頭に入る。

デザインパターンは、動的言語がオススメ。

 

楽々ERDレッスン (CodeZine BOOKS)

楽々ERDレッスン (CodeZine BOOKS)

 

DB設計をしたことがなかったので、面白かった。オススメ。

 

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向設計実践ガイド ?Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方

2回目。やっぱり、オススメ。

 

11月 リモートでのインターン先探し

Wantedly(ウォンテッドリー)「はたらく」を面白くするビジネスSNS

で、リモートで検索して、面白そうなところに応募。

 

12月 リモートでのインターン終了

来年度から一緒に働きましょうということに。

 

以上

大崎上島日記 わくわくすることの種まき

島で、プログラミング教室みたいなことが出来ないかなぁと、FBのページを立ち上げるも、仕事に終われ、それどころではない日々。

 

先日、島のイベントに参加して、そこで島でギークハウスを作りたいねという人に、繋がり、ギークハウスの立ち上げに、参加させてもらうことに。

 

https://www.facebook.com/geeseto/

 

まだ、FBのページのみで、ギークハウス自体は、家探しから始めている状態ですが。

(何か良い物件があれば教えてください。)

とりあえず、何かしましょうか、ということで、第一回もくもく会を開催。

 

もくもく会とは、その名の通り、何人か集まってもくもくと何かプログラミンをしたりする会のことです。

参加者の3人が、Ruby on Railsを、なんとなくやってみたいと一致したので、3人でもくもくと個々のペースでRuby on Railsをやっていました。

 

仕事でプログラミングをしている時は、特にプログラミングが楽しいとも思わなかったですが、久しぶりに完全に趣味ですると、楽しいですね。

 

とりあえず、島でプログラミングする仲間が出来たことが嬉しい。

 

島に住み始めて、1年4か月、今まで生活するために必死でしたが(今も必死だけど)、ちょっとずつ、面白いことをするための余力をもちつつある。

とりあえず、種をまくことはできた。

出来る範囲で、水をあげていきます。

おもしろいことになればいいなぁ。

大崎上島日記 人口知能について勉強してみたい人いませんか?

いきなり、人工知能って、なんでやねん!

と、思われそうですが。。。

 

子供向けプログラミング教室はテンション上がらない

島に移住して、子供向けのプログラミング教室をしたいな~っと、思っていました。

 

legacycode.hatenablog.com

 一応、Scrachやらラズベリーパイを触ってみたりしていたのですが、あまり、テンションがあがらない。

legacycode.hatenablog.com

 

LEGOマインドストームも持っているので、これを使ったりとかも思ったりしたのですが、あまり、テンションがあがらない。

 

 

結局のところ、あまり、子供相手は得意ではないで、無理してやるのはやめにしようと。

家の子供たちも、本に夢中だったり、虫に夢中だったり、野山を駆け回って、今は自然相手に遊んだほうがいい気がして、無理してPCに向かわせる必要もない気がしているというのもあります。

原点回帰

それで、一番興味のある部分をやろうと、思ったところ、人工知能かな?と。

僕の前職はプログラマーだったのですが、そもそも、人工知能に興味があって、その分野に進みました。

ただ、僕が学生だった頃は、ディープラーニングの技術も実用化されていなくて、ニューラルネットワークとかファジーとか遺伝アルゴリズムとか、一応、学んだのですが、「それで?」という感じで、人工知能をやろうと思ったらどこかの研究室にいかないといけないような状態で、そこまで頭もよくないし、そこまで研究する気もないし、ということで普通にプログラマーとして働き始めました。

 

でも、ここ数年、状況は劇的に変わっているように感じます。

 Googleから、デープラーニングのAPI(自由に使えるプログラムの部品のようなもの)が結構公開されているようですし、

グーグルに学ぶディープラーニング

グーグルに学ぶディープラーニング

 

いろいろな人工知能に関する書籍も出版 されています。

 

人工知能勉強会始めます

ということで、人工知能について勉強してみたい人いませんか?

場所は、大崎上島の自分の家を考えています。

 

あまり、期待はしていないのですが、一人でもいればなぁと思って書いてみました。

もし、学びたいと思っているのなら、別にプログラミングの知識などは必要ないと思っています。

結局、僕も元プログラマーとはいえ、おそらく使用するプログラミング言語Pythonになると思いますので、僕も、言ってみれば初心者同然なので、プログラミング環境を整えるところから、ぼちぼちとやっていくことになると思います。

 

とりあえず、このあたりの本から攻めていこうかと思っています。

 

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

 

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

興味のある方は、ぜひ、どうぞ。