プログラミングとはコードを書くことだけではありません。どういった構造にするのか、データはどう扱うのか、どのライブラリを使うのか、いくつもの設計を踏まえてコードを書くのです。設計を表現したものがソースコードです。
設計の良し悪しは品質に影響します。では、良い設計を作るスキルは一体どうやって身につけることができるのでしょうか。プログラミング言語の文法は知識なので、独学でも学ぶことができますが、設計に関してはそうはいきません。
本稿では、プログラミングにおける設計力を高めるためにはどうすれば良いのかを考察します。ここで言う設計は、画面や仕様ではなく、ソフトウェア内部の設計ですが、抽象化するとクリエイティブな仕事全般に通じるかもしれません。
本稿の内容は「良い設計」について論じたものではなく、どうすれば身につくのかを考えたものになります。また、私たちソニックガーデンで行っている、良いコードを書けるようになるための取り組みについても紹介します。
目次
良い設計を身につけるための書く・読む・議論する
プログラマのスキルアップには、いくつかの指向性があります。たとえば、次々と出てくる新しい技術を学び使えるようにしていくのは、横に広げていくイメージです。それに対して、良いコードの設計ができるようになるのは、縦に深めていくイメージで知識というより価値観や美意識を磨いていきます。
プログラミングに美意識というと不思議に思われるかもしれませんが、いくつも設計やコードを見ていると、たしかに美しいと感じるコードがあるのです。まずは、その観点があることを知ること、そして何を美しいと感じるのか審美眼を身につけていくことは設計力の向上に通じています。
設計を含むプログラミングは、スポーツや音楽に似ていて、知識だけを詰め込んだだけでは、できるようになるものではありません。実践を繰り返していく中で、少しずつ上達していきます。良いコードを書くという意識をもって、コードを書き続けることは欠かせません。
他の人の書いたコードを読むことも設計力を高めるインプットになります。どういったコードが自分からみて良いと感じるのか、もしくはイマイチと感じるのか、その視点を持って読んでいくと良いでしょう。そして、自分だったらどんな風に書くか考えるのも効果的です。
ちなみに、「良い設計とは何か」について本稿では取り扱いませんが、この問いを経験のあるプログラマと一緒に議論しあうことも、設計力を高める非常に良い機会になります。そういった正解のない議論を楽しめるかどうかも、プログラマとしての資質を問われます。
良い設計を身につけることは、勘が良ければ一人でもできますが、議論したりして共に良い設計を目指す仲間や先輩がいることが望ましいです。特に、自分と同等か、それ以上の経験を持った人物がいることは自身の成長に大きな影響を与えます。そうした環境を求めて転職する人も少なくありません。
良い設計を身につけるための機会・文化・環境
業務経験を積みさえすれば良い設計を学ぶことができるかと言えば、必ずしもイエスとは言えません。もし良い設計を求められないような環境だったとしたら、自分の書いたコードが改善される機会は得られません。コードレビューがなかったら、どうやって品質を高めれば良いのでしょうか。
また、たとえコードレビューの習慣があったとしても、その目的に良い設計にすることが入っていない場合もあります。Githubのレビュー機能を使った非同期のレビューも良いですが、オンラインでも対面で一緒にコードを見ながらレビューと議論しあえる機会がある環境が良いでしょう。
ソフトウェアは作って終わりではなく、エンハンスし続けていくものだという認知が広まってきたおかげで、多くのプロジェクトでは既存のソフトウェアの保守・改善がメインになっています。それは理に適ったものではありますが、プログラマにとっては設計力を高める機会が減ってしまいました。
既存のコードを読み解き、機能追加をすることでも設計の経験になりますが、ゼロベースから良い設計を考える経験は得られません。なんとも皮肉なことに、納品のあるシステム会社だと、新規開発のプロジェクトも多くあったおかげで、ゼロから設計を考える機会があったのです。
また、経験の浅いうちからフリーランスとして働く方も多くなりましたが、その立場では良い設計を身につける機会が多くありません。設計力の向上も自己責任になりますが、設計力は一人では向上することが困難なことは前述の通りです。かといって、一時的な戦力の方に教育コストは掛けにくいものです。
ゼロからソフトウェアを設計(できれば失敗も)できる機会があること、良い設計を目指す文化があること、仲間同士で良い設計を議論しあえる環境があること、コードレビューで率直に指摘しあえる心理的安全性があること、そうした場に身を置くことで、設計力は高まり成長することができます。
良い設計を身につけるための言語化・フィードバック・お手本
ソフトウェア開発の組織をマネジメントする立場の人であれば、そうした文化を作っていくことが重要な仕事になります。メンバー個々人の設計力が高まることは、ソフトウェアの品質に直結しますし、生産性も高まります。そういった環境を望む人も少なくないので採用や離職にも影響するでしょう。
「動けば良いよ」と言われる環境と、良い設計を目指すことを求められる環境では、どちらで働きたいのか。前者の仕事は楽かもしれませんが、あまり楽しくはなさそうです。後者の方が厳しいですが、成長できるでしょう。そして成長している実感があると仕事は楽しくなるものです。
メンバーに設計力を高めてもらう立場となって考えた時、何ができるでしょうか。特に若手を対象としたときは、彼らの書いたソースコードに対して、コードレビューを通じてフィードバックしていくことが効果的です。ただしレビューとはいえ、コメントで指摘をするだけでは不十分です。
まずは書いた当人に、設計の意図を言語化して説明してもらいます。ソースコードはすべて設計判断の結果です。変数の命名、分岐の位置、メソッドの切り出し方、どれも考えずには作れません。もし当人が説明できないなら、コピペで作っていることになるので指摘しましょう。
次に、ソースコードの良い点・悪い点をフィードバックします。設計の難しさは、正解はないけれども、良い悪いがあることです。以前、デザイナーの方に指導方法を聞きましたが、描かせてみて指摘することを繰り返して育てていくと言っていたのですが、それと同じことです。
また、自分だったらどう書くかお手本を見せます。その際に、考えていることを言語化しながら見せていくことで、作り方を学ぶことができます。これも、完成品だけを見せてしまっては効果は半減します。料理と同じで、出来上がりだけ見ても、同じものを作ることはできません。
良い設計を身につけるための「ジム」という取り組み
こうした環境や機会を、業務の中で提供できることがベストですが、なかなか難しいのも現実です。限られた業務時間の中で、プロジェクトのスケジュールもあるし、フィードバックできるスキルの人も限られるし、なによりゼロから設計する機会は仕事でそれほど多くありません。
私たちソニックガーデンでも、文化やスキルはともかく、そういった現実の問題がないわけではありません。特に「納品のない受託開発」だと、納品しないでソフトウェアをメンテナンスし続けていくことがサービスの売りなので、なおさらゼロから開発する機会など作りにくいのです。
そこで私たちが取り組んでいるのが「ジム」です。主に、採用プロセス途中の方や、社内の若手メンバーを対象にしたもので、用意された課題を複数人がそれぞれで開発をして、互いにフィードバックしあったり、ベテランのメンバーからのフィードバックがもらえたりする活動です。
もともとトライアウトといって、ソニックガーデンの採用プロセスは長い期間をかけるのですが、その期間を一人で過ごすことは孤独感があり、単調にもなりがちなので、もっと効率的に楽しみながら取り組めないか、と始めたものです。ジムは3ヶ月ごとの単位に期を用意しています。
ジムでは、その期を通して作成する、とあるアプリを作るお題が出されます。どういったアプリが必要なのか仕様は用意してあるので、開発だけに集中することができます。だいたい一人でプログラミングを身につけようというときに困るのが、何を作って練習すれば良いのか題材を考えることですよね。
ジムはプログラミングスクールではありません。なので座学はなく、実践のみです。また、義務教育ではないため、自主的に参加してセルフマネジメントで進めていくものです。この辺りは、一般的なスポーツジムと似ているかもしれません。続けていくことで、確実に設計力が身についていくはずです。
お知らせ)設計力が高まるジムを学生・第2新卒に向けて公開
今、ソフトウェア開発の現場では人手不足に陥っています。しかし、とにかく人を入れれば良いかと言うと、ソフトウェア開発において人を増やすだけでは生産性に対して逆効果になってしまいかねません。求められているのは、良いコードを書ける設計力を身につけた開発者です。
一方、そうした設計力を身につけるための機会が、通常の業務だけでは得にくい状況もありそうです。であれば、ソニックガーデンへ応募してくださる方以外にも、ジムをオープン化して参加してもらうことで、良いコードを書ける開発者を少しでも増やしていけるのではないかと考えました。
仕事だけでは成長の限界を感じてるような方や、自分のコードが良いのか改善の余地があるのか知りたい方にとって、もう一段レベルをあげていける環境を提供します。今回は、若い方を応援するために、学生および社会人歴3年までの方を対象に、無償で参加できるようにしています。
ソニックガーデンジムへの参加の詳しい情報と応募については、こちら。
私たちにとってプログラミングは仕事を越えた楽しみでもあり、より高みを目指そうとするプログラマたちが好きなのです。そうした人たちと一緒にジムを通じて、プログラミングの腕を磨きながら楽しんでいきたいと思っています。勇気をもって、ぜひチャレンジしてみてください。