GROUPエンジニアブログです。Calendarの12/21分です。こんにちは、VGエンジニアのポール(@pank7)です。知ってる人はいらっしゃいますが、半年前にvgtechブログを書いた際にはまだ日本語がまだダメなので、英語で書きました。今回はできるだけ頑張って日本語で書きます。ご指導よろしくお願いいたします。何を書きますか私が書ける言語はそんな多くないですけど、普段自分が好きな言語だといえば、C言語はその中の1つです。Cのメリットとしてはやはり多いと思います。シンプルや移植性が良いや効率的やUNIX系OSと仲良いなどというのがあります。今の仕事で使っている言語のPHP、Perl、Python、Shellとかと比べて、正直なところ面倒なデメリットも少なくないと思われています。標準のライブラリーが少ないや標準のデータ構造が弱いやメモリー管理地獄や指針が危険などもいろいろあります。好きな言語なのに、残念ながら、社会人になって職場では一回使ったこともありません。先ほど言った通りに、C言語のデメリットの1つは標準のデータ構造は確かに弱すぎると自分も強く感じています。PHPやPythonならば、配列(list)や連想配列(map)や集合(set)やソート関数などの基本的に必要なものは必ず提供されていますが、C++でもSTLにいろいろ入っています(そんなに使いやすくもないですけど)。́Д`)?!使う際には真っ白から作らなければいけないんですか?という気持ちがどんどん強くなってきて、では、良いコードを探して参考して、自分のライブラリーを暇な時に作らないのと思い始めました。今回は中途半端に作ったものをみんなに見せて、指摘をいただきくために、ブログを書いてみることにしました。興味のある方はご指導よろしくお願いいたします。考えなければいけないことは、良いコードはなんですか?誰の何のコードを参考すればいいですか?違う人の標準は多分異なっていますが、自分のスタンダードからすると、一つ目は多くのところでよく使われているこどです。使われているC言語だと考えたら、Linuxのカーネルはやはり良い選択肢ですね。いうふうに思いながら、Linuxカーネルのコード少し探しました。結果として、予想どおりいつくかが出てきました。それをぐぐるすれば、概論的な文章はいっぱい出てきます。list_headというデータ構造を自分のデータ構造に埋め込んで、いくつかのマクロと関数で、どのタイプのデータもリンクリストとして使えるようになれます。member)0を自分のタイプのアドレスにキャストして、構造体のアドレスからlist_headメンバーまでの距離が分かれます。それで、list_headメンバーのアドレスから構造体のアドレスを推測できています。tree)のデータ構造とアルゴリズムです。これもネット上では紹介文が多いと思います。デザインのせいで、list.hと比べて少し使いにくいですけど、メリットとしては、メモリの使用は非常に効率です。下のはrbtree.hの基本的なデータ構造で、使い方もlist_headと一緒で、自分のデータ構造に埋め込んで(こちらでもcontainer_ofマクロが使われてる)から、関数を呼ぶことだけです。__attribute__((aligned(sizeof(long))));赤黒木の節点では色が付いていますが、この構造を見ると、rb_parent_colorメンバーのこの名前がおかしくないですか?原因は”__attribute__((aligned(sizeof(long))));”のせいで、この構造体のアドレスは必ず8(64ビットX86のCPUなら)の倍数になるので、アドレスの一番右からの3つのビットは絶対0になります。それで、一番右にビットを節点の色として使うことなるので、rb_parent_colorという名前になりました。linux/include/linux/sort.hこれはLinuxカーネルの汎用のソート関数です。インターフェース関数を見ればわかります。size));用意する必要なのもはデータの比較関数とデータの取り替え関数だけです。自分が何を少しやったかというと(https://github.com/pank7/pank7-lib)1、上の3つの部分のコードを切り出して、Linuxカーネルコードの外でもC++でも使える形にしましたhttps://github.com/pank7/pank7-lib/blob/master/list.hhttps://github.com/pank7/pank7-lib/blob/master/rbtree.hhttps://github.com/pank7/pank7-lib/blob/master/sort.h2、そして、intタイプのスタック(int_stack_type)と双方向キュー(int_queue_type)と集合(int_set_type)、この3つの基本的なデータ構造のサンプルコードを書いたことです。https://github.com/pank7/pank7-lib/blob/master/int_stack.hスタックですから、プッシュ、ポップ、ヘッドと空判定関数があります。https://github.com/pank7/pank7-lib/blob/master/int_queue.h双方向キューでは両頭でもプッシュ、ポップできます。https://github.com/pank7/pank7-lib/blob/master/int_set.h集合ですから、存在判定とインサートとリムーブ関数しかありません。テスト用の使い方を表すサンプルコードもいくつかがあります。中途半端なのも、多分完璧ではありませんが、ぜひC言語を書いてる方や興味のある方は使ってみれば嬉しいです、ご指摘よろしくお願いいたします。終わりにlinux/include/linuxの下に他の良いデータ構造とアルゴリズムでもいっぱいあります...他の強い言語でよく使われてる基本的なデータ構造はそれだけではないんですけど、伝えたいこととしては、C言語でも使いやすいデータ構造は多くあるので、C言語のデメリットを改善して、メリットがちゃんと発揮できるということです。Calendar担当は@_zooです。Calendarの12/16分です。データプラットフォーム本部所属エンジニア@bash0C7がお送りします。俺Rubyテスト環境としてはrspec、rr、guard-sporkを愛用しています。フレームワークはPadrino、thorが最近のお気に入りです。■意思決定に足る情報に当たるさて、現在大学3回生のみなさんは就職活動まっただ中かと思います。プログラマー職やシステムエンジニア職に興味をもち、IT技術の世界に飛び込もうと思っている方も少なからずいらっしゃるかと思います。インターネットを巡ると、SEだのプログラマだのという仕事について、きつい、帰れない、しんどい、休みとれないなどネガティブな言葉で語られているのを目にした方も多いと思います。知り合いや先輩がそういう事を言っているのを耳にした方も少なからずいると思います。実際にはどうなのでしょうか。確かに上記のような話は私も見聞きしたことがあります。それらは得てして端的に話をする中で、極めて一部の側面を切り取ってセンセーショナルの切り口にフォーカスした断片的な情報であり、それだけで何らかの意思決定を行うのはあまりに早計過ぎます。コンテキストや雰囲気まで含む総合的な情報として、きちんとまとまった資料に当たることが王道です。そこで、前置きが長くなりましたが、これからの自らのキャリアを考え未来を選択していく上で読むべき情報として私個人として強く薦めたいのが「なれる!SE」です。■「なれる!SE」とは公式サイトの説明を引用すると、「なれる!SE」とはこういう作品です。は厳しい就職活動を経て、とあるシステム開発会社に就職した。そんな彼の教育係についた室見立華は、どう見ても十代にしか見えない少女だった。そんな見た目に反し室見は確かな実力を持つワーカホリック娘で、多忙かつまったく優しくない彼女のもと、工兵は時に厳しく指導され、時に放置プレイされながら奮闘することになる。入社早々、実際の顧客相手の案件担当を振られるのを皮切りに、社内の運用部署との調整や大規模案件の提案、はてはベンダー数社を束ねるプロジェクトマネージャーまで、およそ新卒一年目にはハードルの高すぎる業務を無茶振りされるが!?システムエンジニアの過酷な実態をコミカルに描く物語、それが『なれる!SE』です!小説、漫画、ドラマCD、グッズと、人気作品の王道展開がなされており、小説は12/10に最新刊の8巻が刊行されました。漫画版はWebサイトで読むことができる他、コミック2巻まで刊行されています。内容としては、先に引用した説明文の通り、システムエンジニアの過酷な実態とあるように、確かにそういう部分についてのシーンがイキイキと描かれています。Amazonのカスタマーレビューをみてもそういう部分についての言及が多く、眠りを覚ます恐怖の記憶(トラウマ)が蘇った方が少なからずいらっしゃるようです。主人公の上司の室見さんという人物がこれまた大変イキイキと描かれていまして、これがとてもとても魅力的であり、私としては「室見さんは俺のOJTメンター」という言葉を胸にいだいて生きています。これについても多くの読者が同意していただけるものと信じています。余談ですが、職業人としての室見さんの立ち居振る舞いは色々な意味で参考になります。こちらについてはまた改めて主張しようと思います。確かに、それらの部分に悶え倒すのは素晴らしいエンターティメントです。一読者として大いに楽しませていただきました。自らのキャリアを考える材料として読み取る上では、そういった部分だけをピックアップしてしまうのは、あえて強い口調でいうと誤読であると言わざるを得ません。■環境に依存する事柄を見出す例えば、SEだからプログラマーだから過酷だろうと読み取ってしまうかもしれません。残念ながらこれはあまりに短絡過ぎます。その過酷さは職業に由来する部分よりも環境に依存する部分が多いからです。作中のエピソードを一つ引用すると、小説の1巻で室見さんがこういう事を発言しています。「どんな状況だろうとベストを尽くす。それが私達技術屋の役割よ。クライアントがどんな人間でも扱うプロトコルやパケットは変わらない。いつもと同じことをするだけ」この発言自体は室見さんとしてのエンジニアとしての矜持の発露でしょう。エンジニアとしての矜持としては私は別の考えをもっていますし、人の数だけ違ったものを抱いていると思います。今回の論点はそういう個々人レベルの話ではありません。この発言からは室見さんの周りにある、対立関係の力が働く環境の影響が透けて見えます。今の私のまわりを見渡すに、こういう発言が飛び出る状況はありません。経営理念のCREEDにある「仲間と事をなす」という項目が自分たちにとっていつものことと捉えられているのも、その現れなのでしょう。激しい議論をぶつけ合うというのはあります。ときに過度にヒートアップしてしまうこともありますが、それもまたCREEDにある別の項目「本質を追い求める」の一つであり、信頼があるからこそできる事でもあります。■職業に由来する楽しさを見出すそれで、自らのこれからを考えていく上でこの作品から本当に読み取るべきは、この作品の登場人物たちが生業とし、そして私が生業としているこの職業は最高に楽しいものだという事です。小説の2巻で下記のようなシーンがあります。トラブルが突発し緊急で対応せねばならない事態となり、普段とはまるで違う雰囲気に切り替わった同僚。そのときの室見さんと、同僚のその変わり様に戸惑う主人公とのやり取りです。「この子にはね、運用ドキュメントなんか必要ないの。コンフィグや設定ファイル、ソースコードからでもシステムの全体像を解析し障害ポイントを特定できる。......定型オペレーション?フロー?はっ、よく言うわ。いざとなったらそんなもの見もしないくせに。この子はね、オペレータなんかじゃない。生粋のエンジニア、トラブルシューターよ」トラブル...シューター。呆然とする工兵に室見は「なによ、おかしな顔して」とせせら笑ってみせた。白い歯を剥き出し、ひどく露悪的な顔つきとなる。私たちの仕事とは、私たちの生業とは、各々が日々磨いた技術(ワザ)と積み上げてきた経験で、不都合な現状を解決し、最高な方向に覆すことなんです。その中で、上記のシーンのような障害対応はもちろん重要ではありますが、解決すべきことの一つでしかありません。広く、様々な物事について、自分たちの手で望ましいものを成り立たせ維持することができる、パッションあふるるのがこの生業なのです。ありがたいことに、私たちの周りにはたくさんの実現したいことがたくさんあります。新サービスを立ち上げ、既存サービスを盛り上げ、より素晴らしい技術を取り入れ、予期しがたい事態を解決し、迅速に事を進行する。一生かけても行い尽くせません。そんな楽しい位置に私たちはいるのです。それなので、すでに読んだよという方も、これから読むよという方も、是非こういう部分に着目して、室見さんたちの心の躍動を味わってみてください。GROUPは現在2014年入社となる新卒採用活動を実施しております。仲間として共に挑戦していきたい!という方を募集しております。エエ話を書いてくれます。