優れたエンジニアになること
(0x0001.cc)- 多くのソフトウェアエンジニアは、ソフトウェアへの情熱を持たないまま働いている
- 単に高い給与を得るために働いていても、情熱がなければ最終的に成果は低下する
- 古い技術や誤った信念にとどまり、学ばなければ成長できない
- 優れたエンジニアになるために必要な要素
- エンジニアリングの本質を理解し、深い知識を積み上げる必要がある
- 新しい技術を継続的に学び、批判的に向き合うべきである
- 実践で学んだ知識を適用し改善する習慣が必要である
# 優れたエンジニアを作るものは何か
- エンジニアの定義
「科学的原則を適用して問題を分析し、設計、コード作成、製作、創造などを通じて問題を解決し、世界をより良い場所にする人」
- ソフトウェアエンジニアに求められる能力
- コンピュータがどのように動作するのか、その原理を理解しなければならない
- ハードウェアとソフトウェアが相互作用する仕組みに対する深い理解が必要
- 抽象化された言語や技術だけに依存せず、基礎から学ぶべきである
ドメインへの深い理解
- 基礎原理に対する強い理解が必要である
- 機械エンジニア → 材料の特性と応用知識
- ソフトウェアエンジニア → メモリとCPUの動作原理の理解
- 基礎原理から学ぶべきである
- HTTP、メモリ構造、システム動作など、基本概念への深い理解が不可欠
- 上位レベルから始めるのではなく、基礎から積み上げるべきである
継続的な学習
- 最新技術および開発動向を継続して学ぶ必要がある
- 新しい技術の長所と短所を批判的に分析しなければならない
- 学習の過程で見つけた新しいテーマをさらに深く掘り下げる
- 数学を学ぶときに細部のテーマへつながっていくように、学習の深さを広げる必要がある
技術の限界と問題点を理解する
- ツールや言語の長所と短所を明確に理解しなければならない
- 特定の言語やツールを過度に信奉する姿勢は警戒すべきである
- プロジェクトに合った最適なツールを選ぶことが重要である
実践で知識を適用する
- 理論だけ知っていても意味はない
- 学んだ知識を実際のプロジェクトに適用しなければならない
- 問題を解決したり概念を証明したりするために活用すべきである
- 実践適用の例
- 小規模なプロトタイプの構築
- 日常で発生する問題の解決
- 学んだ内容を他の人に説明し、教えること
# より良いエンジニアになる方法
批判的思考力を養う
- 批判的思考はエンジニアリングの中核要素
- 概念とその効果を理解し、問い直すために不可欠である
- 批判的思考が不足していたり軽視されたりすると、非効率や複雑さを招く
- 批判的思考力を強化する
- 新しい概念に触れたときは無条件に受け入れず、有効性と妥当性を検討すべきである
- 特定のアプローチの長所・短所と代替案を論理的に分析しなければならない
- 批判的思考の学習資料: Critical Thinking を参照
もっと本を読む
- 読書は知識を習得する効果的な方法
- ソフトウェアエンジニアリングに関するさまざまなテーマの書籍がある
- 単に本の内容を受け入れるのではなく、批判的に向き合うべきである
- 批判的に読むための質問例
- 「このアプローチには問題があるか?」
- 「より良い方法はあるか?」
- 「自分ならどう違うやり方をするか?」
- 「この本で説明されている内容は本当に正しいのか?」
- ノートを取る習慣を身につける
- 学んだ内容と思考を整理して記録する
- わからないテーマが言及されたら追加で調べる
- ノート作成ツールとして Obsidian を推奨(個人の好みに応じて選択可能)
- おすすめの読書リスト
学んだ知識をプロジェクトに適用する
- 理論から実践へつなげる
- 学んだ内容を実際のプロジェクトで適用してこそ、本当の学習が成立する
- 概念を実際に実装することで、より深い理解が可能になる
- 小さなプロジェクトやプロトタイプでも、自分で作ってみることが重要である
- 実践適用の過程で得られる利点
- 理論では見えなかった現実の問題に直面することになる
- 問題解決の過程で知識を具体化し、改善できる
- 問題解決能力と論理的思考力が強化される
- 学んだ内容を適用する方法
- 小さなプロトタイプを構築する
- 新しいフレームワーク、言語、概念を学んだ後に小さなプロジェクトを試す
- 例: データベースのインデックスを学んだ後、簡単な検索システムを実装して性能を比較する
- 実際の問題を解決する
- 日常や仕事で発生する小さな問題を解決してみる
- 例: 繰り返しの手作業の自動化、性能低下の問題改善など
- 学んだ内容を教える
- 学んだ内容を他人に説明しながら理解を深める
- ブログを書く、Twitter スレッドを書く、または同僚と議論する
- 教える過程で新しい視点を発見できる
- 継続的に知識を適用すれば、理論的理解が実践力へと転換され、より有能なエンジニアへ成長できる
自分のコードを評価し改善する
- 自己批判は優れたエンジニアの中核的な習慣
- 多くのエンジニアは、コードが動けば「十分だ」と考えてしまう誤りを犯す
- しかし真のエンジニアは、常に改善の余地があることを認識している
- 自己評価の目標
- 自分に過度に厳しくなる必要はない
- 継続的な改善の機会を見つけることが核心である
- コードを動かすことに満足せず、性能、保守性、可読性の改善策を探るべきである
- 継続的な自己評価の効果
- コード品質が徐々に向上する
- 自己批判を通じて問題解決能力が強化される
- 自分の知識と能力を絶えず発展させられる
# ソフトウェアエンジニア向けおすすめ一覧
おすすめ書籍
- Designing Data-Intensive Applications – データ中心アプリケーション設計
- Introduction to Algorithms – 英語タイトルのまま
- Writing a C Compiler
- Essential Maths for Data Science – データサイエンスのための必須数学
- Elements of Information Theory
おすすめプロジェクト
- コンパイラ - 選んだ言語向けのコンパイラを書いてみる、LLVM または JVM を参考にする
- エミュレータ - シンプルなCPU(例: 8086)のエミュレータを書く
- レンダリングエンジン / ゲームエンジン - OpenGL または Vulkan を使ってグラフィックプログラムを書く
- メモリビューアおよびエディタを書く - 他のプログラムのメモリと相互作用するプログラムを書く
- HTTPサーバを書く - 低水準言語で HTTP サーバを書く
- Webサイトや単純なプロジェクトは避けること。学習効果が低い可能性がある。上で挙げたプロジェクトから1つ選び、テーマを調べたうえで自分で実装してみること
結論
- 優れたエンジニアになるとは、多くのプログラミング言語を知っていることではない
- 基本原理への深い理解 + 批判的思考 + 実践適用 が核心である
- 学び、適用し、絶えず改善する姿勢が必要である
- エンジニアリングは終わりのない旅であり、成長しようとする姿勢が重要である
結論
- 優れたエンジニアになることの本質
- 最も多くのプログラミング言語を知ること、最新フレームワークを習得すること、新しい技術を追いかけることではない
- エンジニアリングの基本原理に対する深い理解が核心である
- 学んだ知識を実際のプロジェクトに適用し、批判的に考え、絶えず成長しなければならない
- 最高のエンジニアの特徴
- 学ぶことをやめず、新しい知識を身につける
- 自分の前提を絶えず疑い、改善策を探す
- 学んだ知識を実際の問題解決に適用し、同僚と協力しながら成長する
- エンジニアリングは生涯の旅
- 好奇心(curiosity)、継続力(discipline)、成長への意志が必要である
- これらの原則を実践すれば、優れたエンジニアを超えて偉大なエンジニアになれるだろう
9件のコメント
Linuxカーネルのメモリ管理まわりにもコントリビュートしたことがあり、低レベルの動作についてもある程度理解していると思っていますが、結局は望まない形で開発とは距離のある仕事をしていることを考えると、この記事とは逆に行動したほうが、うまくいくエンジニアになれるのではないかと思います。
帰国してみると、韓国は市場があまりにも小さく競争が激しいため、開発に集中できる会社やポジションが少なく、その少ない席を互いに取り合っているので、結局は人目を引くものに集中してこそ、自分がやりたい開発ができるように見えます。
私も共感します! そして、ここで言う「良い」エンジニアがどんなエンジニアなのかは、人によって解釈がかなり違う気がします。極端かもしれませんが、基礎知識の重要性を理解していたとしても、市場で価値のないエンジニアは良いエンジニアなのかと考えさせられます。
本当に共感します、、、
本質的なことをどれだけ正確に把握してうまく扱えるかのゲームではなく、
特定の言語や特定の技術をトレンドに合わせてうまく使えるかのゲームになっているのが残念ですね、、
韓国にも優秀なエンジニアは多いと思いますが、私自身も市場規模のせいで惜しいと感じる部分が多いです。
FuriosaAIのようなところがうまくいってくれたらよかったのに、と思います。
FuriosaAI、潰れたんですか……?
少し共感できますね.. 笑
韓国市場だけがそうなのかな…
少し前に会社でKotlin言語の勉強会のために一度セミナーをしたことがあるのですが、部署で主に使っているC++言語と比較する形で説明してみたところ、反応が良かったのを覚えています。肝心の私はC++をほとんど使わず、部署のメンバーはKotlinに初めて触れる状況だったのですが、いろいろな面で皆の成長に役立ったように思いました。
Hacker Newsの意見
読書についての意見がとても気に入った。多くのエンジニアがドキュメントや書籍よりも動画や浅い投稿を好み、その結果多くのことを見落としているのをよく目にする
この記事で言及されている多くの点には同意する。ただ、CPU、メモリ、HTTP などの深い基礎を知ることが、どうすればより良いエンジニアになる助けになるのかはいまひとつ確信が持てない
基礎の奥深いところまでは分かりませんが、基礎を知らないと本当にあきれるような、とうてい想像もできない結果を生み出すのを見てきました。
例えば、DBにあるすべてのレコードをメモリに入れてから、メモリ上で検索するように実装する。
レコードが少ないときは問題なく動きますが、レコードが多くなるとメモリがあふれる。
メモリとDBがどう違うのかをまったく分かっていないので、こういう書き方になります。
これは一つの例にすぎませんが、毎回本当に想像もつかない方向に実装します。
普通の(?)プログラマーには本当に想像できません。