会社ってめんどくさい 人のしがらみが面倒でエンジニアになったのに

私の仕事

日本のとあるメーカーで技術開発をしている、社会人3年目のエンジニアです。 プログラムを書いたり、回路設計したり、報告書を作ったりしています。

「技術」以外のノイズが増えてきた

3年目になり、他部署や社外との関りが増えてきました。 仕様のやり取りだけなら楽しいのですが、

「今これを受けると、今後も頼られるから一旦スルーで」

「うちが主体だと予算を持つことになるから様子見で」

「ここは他社に投げたほうが角が立たない」

……だのなんだの、技術以外の注文が激増。正直、めんどくさいです。 「ああ、社会人ってこういう調整ごとの方が多いんだなぁ」としみじみ感じた一年でした。

社内政治を乗り越える「2つの生存戦略

そんな環境で生き残るために、今年意識して実行した戦略が2つあります。

戦略①:議論している間に作って、叩きつける

1つ目は、「圧倒的な事前準備」です。 偉い人たちはギリギリまで動かないし、ギリギリにならないと現場の意見を聞いてくれません。

だから私は、「とりあえず裏で手を動かして作っておき、タイミングを見て完成品を叩きつける」という手法を取りました。

技術がわからない上層部に期待するのは諦めましょう。彼らが無駄な議論をしている間に、勝手に準備するのです。 上司が見積もり甘い仕事は、あえて工数を長めに確保して、その間に作るのです。 結局、上の人たちは「議論」よりも「動くモノ」を見せれば大体満足します。(たまに難癖はつきますが)

戦略②:有能な上司を「正しく」使う

2つ目は、「有能な人を頼る」こと。 有能な上司は、頼られることに慣れています。ここぞという時は甘えましょう。迷惑をかけるのは若手の特権です。

ただし、「頼る人」の見極めは重要です。頼られて嫌がらない人を選びましょう。 そして、手柄を独り占めしないこと。「○○先輩に教えていただいて解決しました」と報告時に添えるだけで、次回も助けてもらえるようになります。これも立派な技術です。

最後に

文句も言いつつ、なんやかんやエンジニアとして楽しかった2025年でした。 皆さんはどんな1年でしたか?

来年は仕事のハックだけじゃなくて、プライベートももっと充実させていきたいです。


2025年はどんな1年でしたか?「仕事の思い出」を振り返って、Amazonギフトカードをゲット!

良かったことも、悪かったことも、全部ひっくるめてブログ&SNSでシェアしてください!

MEETS CAREER × Hatena Blog 特別お題キャンペーン #2025年仕事の思い出
MEETS CAREER_odai
by マイナビ転職


【Arduinoの裏側②】void loop() の外側、隠された main 関数

前回の「アップロードの仕組み」に続き、今回はプログラムの中身のお話です。

前回はこちら cratech.hatenablog.jp

C言語C++の教科書を読むと、最初の方に必ずこう書いてあります。 「プログラムは main 関数から始まり、main 関数で終わる」

しかし、Arduinoのスケッチ(プログラム)を見てみましょう。あるのは setup()loop() だけ。 C言語のルールに従えば、これはコンパイルエラーになるはずです。

なぜArduinoはエラーにならずに動くのでしょうか? 実は、私たちの目に見えない裏側に、本当のmain関数が隠されているからです。

今回は、Arduino Core(システムの核)のソースコードを覗き見て、その正体を暴いていきましょう。


全体像:setuploop は「呼ばれている」だけ

結論から言います。 私たちが一生懸命書いている setup()loop() は、プログラムの支配者ではありません。 彼らは、裏にいる main() 関数から「呼び出されている」だけの部品に過ぎないのです。

イメージとしては、このような包含関係になっています。

main という大きな枠組みの中に、私たちのコードがすっぽりと収まっているのです。


証拠:実際のソースコードを見てみよう

論より証拠。Arduinoのインストールフォルダの奥底に眠る、実際のソースコードmain.cpp)をお見せします。 これが、Arduinoが動いている時の「真の姿」です。

実際の main.cpp の中身(要約)

#include <Arduino.h>

// ここが本当のスタート地点!
int main(void)
{
    init();  // ① 初期化(タイマー設定など)

    setup(); // ② 私たちが書いたsetupを実行

    for (;;) { // ③ 無限ループ
        loop(); // ④ 私たちが書いたloopを実行
        if (serialEventRun) serialEventRun(); // ⑤ シリアル通信のチェック
    }
        
    return 0;
}

※わかりやすく一部省略していますが、構造は忠実に書いています。


コードの解説:裏で何が起きている?

このコードを読み解くと、Arduinoの挙動が見えてきます。

① init()

まず最初に init() という関数が呼ばれます。 ここでは、「時間の計測(millis)」「PWM(アナログ出力)」などが使えるように、マイコン内部のタイマー設定を自動で行っています。 私たちが面倒なレジスタ設定なしで delay(1000) と書けるのは、ここで準備してくれているおかげです。

② setup()

次に、私たちが書いた setup()1回だけ呼ばれます。

③ for (;;) { ... }

for (;;)C言語で無限ループです。

Arduinoは、この無限ループの中で、 1. loop() を呼ぶ 2. loop() が終わったら、また戻ってきて loop() を呼ぶ

をひたすら繰り返しているだけなのです。

つまり、void loop() という関数自体がループしているわけではなく、「外側の main 関数によって、何度も何度も呼び出されている」というのが真実です。

なので、loop関数内でreturnしても、loopの最初に返ってきます。これはfor(;;)で囲まれているからなのです。


なぜこんな構造なのか?

なぜ普通に main() を書かせず、わざわざ setuploop に分けたのでしょうか? それは、「組み込みプログラミング特有の作法(無限ループ)」を初心者に意識させないためです。

本来、組み込みプログラムは以下のように書きます。

int main() {
    初期化();
    while(1) {  // 自分で無限ループを作らないといけない
        処理();
    }
}

もし初心者が while(1) を書き忘れると、プログラムは一瞬で終了して止まってしまいます(Lチカなら、一瞬光って消えて終わりです)。 Arduino開発チームは、この「枠組み」をあらかじめ用意してあげることで、 「とにかく loop の中に書けば動き続けるよ!」 という手軽さを実現したのです。素晴らしいですね。


エンジニアの視点:ここから分かること

この構造を知っていると、開発で役立つ知識が2つあります。

1. loop() の終わりは一瞬の隙間

loop() 関数の最後の行まで行くと、一度 main に戻り、またすぐに loop が呼ばれます。 この「戻って入り直す」処理には、ほんのわずかですが時間がかかります(オーバーヘッド)。

もし、マイクロ秒単位で極限まで速い処理(高速な波形生成など)をしたい場合は、loop() の中身をあえて while(1) { ... } で閉じ込めてしまい、main に戻さないというテクニックもあります。

2. serialEvent の正体

main.cpp の中に if (serialEventRun)... という記述がありましたね。 これは「シリアル通信でデータが来ているか?」をチェックする機能です。 loop() が一周するたびに毎回これがチェックされるため、loop() の中で重い処理(delay(3000)など)をしてしまうと、このチェックが遅れ、通信の反応が悪くなる原因になります。


まとめ

  • Arduinoにもちゃんと main() 関数はある。
  • setuploop は、裏方から呼ばれているだけのパーツ。
  • この親切設計のおかげで、初心者は「無限ループ」を気にせずコードが書ける。

さて、裏側の構造が見えてきました。 次回は、いよいよハードウェアに近い部分に踏み込みます。

便利でよく使う digitalWrite 関数。実はこれ、プロの現場では「遅すぎるから使うな」と言われることがあります。 なぜ遅いのか? どうすれば速くなるのか? 次回はレジスタ操作」について書く予定です。

社会人3年目、エンベデッドシステムスペシャリスト試験に合格しました!

昨日2025/12/25の正午、IPAから高度情報処理技術者試験の合格発表がありました。

震える手でスマホを確認したところ……

無事、エンベデッドシステムスペシャリスト試験(ES)に合格していました!!

サンタさんからのクリスマスプレゼントですねw

ちょうど1年前に応用情報に受かっているので午前Ⅰは免除です。

午後IIの記述が最後まで不安だったのですが、なんとか滑り込みました。(午後Ⅱの論述は手首痛かった...)

午前中そわそわして仕事にならなかったので、今はとにかくホッとしていますw

 

社会人3年目での挑戦

私は普段、仕事でも組み込み開発をやっています。仕事で得られる知識は偏りも多く、体系的な知識を得たいと思って勉強を始めました。

勉強自体は試験半年前から始めたのですが、ちょうど5~6月が忙しく、本格的に勉強したのは3ヶ月ほどです。

3年目だと足りない知識も多く、特に午後Ⅰ,Ⅱが経験値がない私にとっては厳しかったです。実際合格者の平均年齢を見ると、経験値がある方が多いように見えます。

合格率と合格者平均年齢

 

勉強方法

私が行った勉強方法についてざっくり書いていこうと思います。詳しい話は別で書くかも...

 

1. 参考書

情報処理教科書 エンベデッドシステムスペシャリスト 2024~2025年版

www.amazon.co.jp

「うかる!エンベデッドシステムスペシャリスト」というシリーズの本です。

参考書はこの1冊だけで勉強しました。

午前Ⅱ,午後Ⅰ,Ⅱの解説と問題がすべて含まれてる上に、図も多くてわかりやすいです。

解説の横に用語説明欄があるので、ここもしっかり確認しておくことをお勧めします。

 

2.過去問

参考書だけでは足りなかったので、こちらのサイトにお世話になりました。

www.es-am2-trainer.com

エンベデッドシステムスペシャリストは過去問道場がないので、高度情報の中でも人気ないんだなと痛感しましたw

 

具体的な勉強方法

僕は参考書を読み込んでから過去問を解きました。

僕は組み込みの勉強を目的としていたので先に解説を読みましたが、合格を目的とするなら先に過去問を解いたほうがいいと思います。

試験(特に午前Ⅱ)では過去問と同じ問題や類似問題がたくさん出るので、過去問を解いてわからないところは参考書の解説を読むのがベストだと思います。

 

まとめ

今日は取り急ぎ、合格のご報告でした。

エンベデッドシステムスペシャリスト試験の具体的な勉強スケジュールや解説、ほかにも基本情報や応用情報の解説なんかも書いていければなと思っています。

エンジニアの皆さん、一緒にスキルアップしていきましょう!

【雑記】メモリ、また高くなってる

会社のPCのメモリを増設しようと価格ドットコムを覗くと、とんでもない価格高騰が...

3ヶ月で5倍くらいになってます.....

原因として考えられるのは、やはりMicron(Crucial)のコンシューマー向け供給の激減ですよね。 店頭からCrucialの緑の基板が消えると、ここまで相場に影響が出るのかと痛感しています。

AIバブルの余波が直撃

噂レベルですが、OpenAIなどのAI企業が、世界のDRAM生産能力の40%を確保する、という話も耳にします。

Micron: コンシューマー向けを絞って、HBM(AI用メモリ)に全振り?

Samsung: こちらも同様にAI向けへシフト。

こうなると、「Micronが引くならウチも……」と他社も追随するでしょうし、市場に出回るDDRメモリは枯渇する一方です。 「さらに高騰する前に確保しなきゃ」というパニック買いも重なって、この異常事態が起きているのでしょう。DDR5がなくなると必然的にDDR4も追従しますしね...

結論:この流れは止まらなさそう

生成AIの性能向上戦争が止まらない限り、メモリの価格は上がりっぱなしになりそうな気がします。

自作PC勢やサーバー管理者には厳しい冬ですが、「必要な時が買い時」と割り切るしかなさそうです。

【Arduinoの裏側①】コードが「電気」に変わるまで。コンパイルと書き込みの仕組み

皆さんもよく使っているArduino、そのArduinoでLEDをチカチカさせる時、私たちは当たり前のようにIDEの「→(マイコンボードに書き込む)」ボタンを押します。 一瞬で完了するこの作業ですが、実は裏側では「翻訳・通信・書き換え」という、処理が行われています。

普段はなんとなく動くこのArduinoですが、この蓋を開けて中身を知ると、エラーが出た時に自力で解決できるようになったり、他のマイコンへの応用が効くようになったりします。

今回は「パソコンで書いた英語(コード)が、なぜ電気信号に変わってマイコンを動かせるのか?」 を解説します。


全体像:コードがメモリに届くまで

ボタンをと押した瞬間、プログラムは以下の3つの工程を経て、Arduinoの脳(マイコン)に届きます。

  1. コンパイル(翻訳): 人間の言葉を機械語に変換する
  2. USBシリアル変換(通訳): PCとマイコンの言葉の壁を越える
  3. ブートローダー(案内人): データを受け取り、メモリに書き込む

1. コンパイル(翻訳)

~英語を「0と1」にする作業~

まず大前提として、マイコンArduinoに乗っているATmegaチップなど)は、C言語が読めません。 彼らが理解できるのは、電気のON/OFFを表す「0」と「1」の羅列(マシン語/バイナリ)だけです。

そこで、私たちが書いたコード(人間語)を、マイコンが読める言葉(機械語)に翻訳する必要があります。これがコンパイルです。

実は「Arduino言語」なんてない?

よく「Arduino言語」と言われますが、実は中身は、組み込み業界で標準的に使われているC++そのものです。

Arduino IDEの裏側では、avr-gccという翻訳ソフト(コンパイラ)が動いていて、 * digitalWrite(13, HIGH); ↓ * 01010011 11000101 ... (.hexファイル)

という風に翻訳を行っています。この「0と1の変換済みデータ」のことをhexファイルと呼びます。

細かい話をすると、elfファイルという、デバッグのためのすべての情報が入ったファイルが生成され、そこから マイコンが動くためだけのhexファイル**が生成されます。

「Expor Compiled Binary」でコンパイルを行うとelfファイルやhexファイルが生成されます。是非見てみてください。

2. USBシリアル通信(通訳)

翻訳が終わったら、次はデータをArduinoに送ります。ここで問題になるのが「通信方式の違い」です。

  • パソコン: 「USB」で話したい。
  • マイコン: 「UART(シリアル通信)」で話したい。

この二人は直接会話ができません。そこでArduino基板上には、「USBシリアル変換IC」という仲介役のチップが乗っています(USBポートの近くにある、小さな黒いチップです)。ft232rlなど、FTDIのチップがよく使われていますね。

このチップが、PCから来たUSBの電気信号を、マイコンが理解できる「RX/TX(受信・送信)」の信号にリアルタイムで変換してくれます。

(互換ボードですが、、、)

3. ブートローダー(案内人)

ここが今回の一番のポイントです。 シリアル通信でデータが届いたとして、マイコンはどうやってそれを「自分の記憶(フラッシュメモリ)」に焼き付けるのでしょうか?

本来、生のマイコン(買ったばかりのICチップ)にプログラムを書き込むには、数千円〜数万円する「専用の書き込み機(プログラマ)」というハードウェアが必要です。

でも、ArduinoはUSBケーブル1本で書き込めますよね。なぜでしょうか? それは、マイコンの中にブートローダー」という小さなプログラムがあらかじめ住んでいるからです。

ブートローダーの働き

ブートローダーは、マイコンが起動(リセット)した直後に、一番最初に動き出す「案内人」のようなプログラムです。

  1. リセット: (書き込みボタンを押すと、自動でリセットがかかります)
  2. ブートローダー起床: PCから新しいプログラムが届いてるか、を確認。
  3. 書き込み: プログラムが届いていれば、それを受け取って、自分自身のメモリを書き換える。
  4. 実行: 届いていなければ、すでに書き込まれているプログラムを実行する。

この「最初に書き込まれている案内人」がいるおかげで、私たちは高価な機材を買わずに、手軽に電子工作を楽しめるのです。


まとめ

私たちが「書き込み」ボタンを押したとき、裏側これらが起きています。

  1. コンパイラが、C++機械語(HEX)に翻訳する。
  2. 変換チップが、USB信号をシリアル信号に通訳する。
  3. ブートローダが、データを受け取ってメモリに焼き付ける。

これが分かると、「書き込みエラー」が出たときに「あ、USB変換チップのドライバが入ってないな」とか「ブートローダーが壊れたかな?」と推測できるようになります。

次回

第二回はこちら!

cratech.hatenablog.jp

【初投稿】回路・システム開発の現場から。初心者エンジニアと学生のための技術ブログ開設

はじめまして。くらてちです。

普段はメーカーで組み込みエンジニアをしている、社会人3年目の新人エンジニアです。


年の瀬も押し迫った今日、技術系の発信や学習記録を残すためブログをはじめてみました。

記念すべき1記事目なので、簡単な自己紹介と、これからこのブログで書いていく内容についてお話しします。

 

自己紹介

  • 職業:組み込みエンジニア(3年目)
  • 専門分野:C言語、回路設計、システム開発
  • 経歴:某国立大学工学部情報工学専攻→国内メーカー
  • 趣味:電子工作、ロボット、料理(お菓子)、美容
  • 苦手:英語

 

ブログを始めたきかけ

  • 知識・経験の共有
  • 学習モチベ維持
  • 日記

今まで資格勉強等いろいろしてきたのですが、最近モチベの低下が激しく。。。

今後つよつよエンジニアとして生きていくために、勉強や挑戦を記録していきます。

他にも有益な情報を提供していきますので、資格や語学の勉強してる人、エンジニアの人、何かに挑戦したい人、一緒に頑張りましょう!

 

今後書いていくコンテンツ

  • エンジニアの勉強や開発
  • IT資格や高校情報の開設
  • 勉強記録(資格とか英語とか)
  • 他の趣味(料理、美容)

 

今後の目標

まずは半年継続!誰かに役立つ記事をたくさん残していきたいと思います!

これからよろしくお願いします!