たかがC++、されどC++
2年8ヶ月ぶりにこのカテゴリを書くのか…(^^;
昨年末に逃げた協力会社の代わりとして、今年の頭から超ひっさし振りにC++のコードを書く仕事をしているのですが(「仕事」では…で、趣味ではたまに書いてたりします)、他の協力会社のスキルもド素人から初級クラスだけで構成されており、逆に自社の方は神クラスの人が書いたりメンテしているというカオスな状況になっています。(自社の方の人のスキルはC++歴が私とほぼ同じの2x年クラス。というか私と違ってC++案件のブランクがゼロのようなので、正直「ネ申」です。これが私を除いて2名もいます)
協力会社のスキルは、for文一つとっても知識の差がバラバラで、「ヲイヲイ、分かってないのにこの文法使ってるだろう…」みたいな感じのコードを生み出します。
IT業界の人口は爆発的に増えていますが(今後も当面増え続けるでしょうね)、「本当にデキるという人に出会えるというは一握り」なのは、何年経っても余り変わらないなぁ~と。(言語に限らず)
ということで、なんとなく上述した「for文一つとっても」的な例を書いてみたくなりました。
【ソース】
GCC(g++) 5.3.x でコンパイルしました。「-std=c++11」のオプション付きです。
処理はcase.1~case.4まで同じ事をします…が、言語は同じなのに、記述(文法)はかなり違って見えます。
歴史があるって凄いことですね。
【出力結果】
case.4まで習得しろとは思いませんが(スキルの低い人が読めないコードなんか書いても仕事が進まなくなるから)、少なくともcase.2位は20年以上変化していない仕様なので、これを常識的なレベルで理解していないと仕事にならないレベルの仕事なんだけど…という感じなのですが、流れ上、case.1も本当に分かっているのか不安になりそうなビギナーが仕事の結構重要なコード書いている事が分かっているので、「この仕事って、絶対に終わっているよな…」と毎日思ってます。(私がどうこうできるような状況でもないので、心に留めておくだけで、諦めながら仕事している)
そのような中、ソースが汚くてバグだらけで、且つC++の仕事なので、プログラムがクラッシュしたら、「誰がメモリを破壊した?」みたいな「容疑者を探す&もしかしたら自分が壊しちゃったんじゃないだろうか…というドキドキさせられる」事が多くて、精神衛生上、非常に体に良くないのがなんともだったりします。
高級で高価で高度な動的解析ツールで探そうにも、深部に働く「あるもの」を作っているので、そんな素晴らしいものが使えるわけでもなく(予算もないし)、昨晩も「動いているプロセスにデバッガをアタッチしてメモリの中を覗く」という気持ち悪い解析作業をしていたりします。(昨晩は22:40分に犯人を1人炙り出せましたが、このような作業は時間がかかって仕方がない)
「ITスキルを計測するスカウターがあったら、いいのになぁ~。数値化してレベルが低ければ、当然そんな人材は雇わないで済むし。」…と思いつつ、「一括発注だとやっぱり無理か…」という事もしょっちゅう思ったりなんかしちゃったりして。(^^;
今のプロジェクトに参画して丸1年経ちますが、早く終わんないかなぁ~と思う、今日このごろでした。
ちなみに協力会社に対して「素人素人」言ってますが、どのようなコードを書くかというと、
【case A (ド素人)】
【case B (初級者)】
とか書くレベルです。凡ミスというレベルでは無く、素で書きます。
オマエJavaグラマーとかだろ? C++ナメてんだろ?
…ダミだこりゃ。(´・ω・`)
昨年末に逃げた協力会社の代わりとして、今年の頭から超ひっさし振りにC++のコードを書く仕事をしているのですが(「仕事」では…で、趣味ではたまに書いてたりします)、他の協力会社のスキルもド素人から初級クラスだけで構成されており、逆に自社の方は神クラスの人が書いたりメンテしているというカオスな状況になっています。(自社の方の人のスキルはC++歴が私とほぼ同じの2x年クラス。というか私と違ってC++案件のブランクがゼロのようなので、正直「ネ申」です。これが私を除いて2名もいます)
協力会社のスキルは、for文一つとっても知識の差がバラバラで、「ヲイヲイ、分かってないのにこの文法使ってるだろう…」みたいな感じのコードを生み出します。
IT業界の人口は爆発的に増えていますが(今後も当面増え続けるでしょうね)、「本当にデキるという人に出会えるというは一握り」なのは、何年経っても余り変わらないなぁ~と。(言語に限らず)
ということで、なんとなく上述した「for文一つとっても」的な例を書いてみたくなりました。
【ソース】
GCC(g++) 5.3.x でコンパイルしました。「-std=c++11」のオプション付きです。
処理はcase.1~case.4まで同じ事をします…が、言語は同じなのに、記述(文法)はかなり違って見えます。
歴史があるって凄いことですね。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
int main(int argc, char** argv) {
// case.1 (for 文)
{
printf("case.1 ----\n");
int int_array[3];
for (int i = 0; i < sizeof(int_array) / sizeof(int_array[0]);) {
int_array[i] = i++;
printf("%d\n", int_array[i]);
}
}
//---- 超え辛い壁 (古い地球人には厳しい…らしい)----
// case.2 (イテレータ)
{
std::cout << "case.2 ----" << std::endl;
typedef std::vector<int> VEC_INT;
VEC_INT int_array(3);
int i = 0;
for (VEC_INT::iterator it = int_array.begin(); it != int_array.end(); ++it) {
*it = i++;
std::cout << *it << std::endl;
}
}
//---- 超えられない壁 ----
// case.3 (C++11 auto 型)
{
std::cout << "case.3 ----" << std::endl;
typedef std::vector<int> VEC_INT;
VEC_INT int_array(3);
int i = 0;
for (auto it: int_array) {
it = i++;
std::cout << it << std::endl;
}
}
// case.4 (C++11 ラムダ式)
{
std::cout << "case.4 ----" << std::endl;
typedef std::vector<int> VEC_INT;
VEC_INT int_array(3);
int i = 0;
std::for_each(int_array.begin(), int_array.end(), [&i](int& it)
{ it = i++; std::cout << it << std::endl; });
}
// case.x (C++11 map)
{
std::cout << "case.x ----" << std::endl;
typedef std::map<int, int> MAP_INT;
MAP_INT map_int = {{0, 10}, {1, 20}, {2, 30}, };
int i = 0;
for (auto& it: map_int) {
std::cout << "[" << it.first << "]=" << it.second << std::endl;
it.second = ++i * 100;
}
for (auto it: map_int) {
std::cout << "[" << it.first << "]=" << it.second << std::endl;
}
}
return 0;
}
【出力結果】
case.1 ----
0
1
2
case.2 ----
0
1
2
case.3 ----
0
1
2
case.4 ----
0
1
2
case.x ----
[0]=10
[1]=20
[2]=30
[0]=100
[1]=200
[2]=300
case.4まで習得しろとは思いませんが(スキルの低い人が読めないコードなんか書いても仕事が進まなくなるから)、少なくともcase.2位は20年以上変化していない仕様なので、これを常識的なレベルで理解していないと仕事にならないレベルの仕事なんだけど…という感じなのですが、流れ上、case.1も本当に分かっているのか不安になりそうなビギナーが仕事の結構重要なコード書いている事が分かっているので、「この仕事って、絶対に終わっているよな…」と毎日思ってます。(私がどうこうできるような状況でもないので、心に留めておくだけで、諦めながら仕事している)
そのような中、ソースが汚くてバグだらけで、且つC++の仕事なので、プログラムがクラッシュしたら、「誰がメモリを破壊した?」みたいな「容疑者を探す&もしかしたら自分が壊しちゃったんじゃないだろうか…というドキドキさせられる」事が多くて、精神衛生上、非常に体に良くないのがなんともだったりします。
高級で高価で高度な動的解析ツールで探そうにも、深部に働く「あるもの」を作っているので、そんな素晴らしいものが使えるわけでもなく(予算もないし)、昨晩も「動いているプロセスにデバッガをアタッチしてメモリの中を覗く」という気持ち悪い解析作業をしていたりします。(昨晩は22:40分に犯人を1人炙り出せましたが、このような作業は時間がかかって仕方がない)
「ITスキルを計測するスカウターがあったら、いいのになぁ~。数値化してレベルが低ければ、当然そんな人材は雇わないで済むし。」…と思いつつ、「一括発注だとやっぱり無理か…」という事もしょっちゅう思ったりなんかしちゃったりして。(^^;
今のプロジェクトに参画して丸1年経ちますが、早く終わんないかなぁ~と思う、今日このごろでした。
ちなみに協力会社に対して「素人素人」言ってますが、どのようなコードを書くかというと、
【case A (ド素人)】
std::string hoge;
memset((void*)&hoge, 0, MAX_PATH);
【case B (初級者)】
std::string hoge = "text... (長ぁ~い文字列)";
SetText(hoge);
----
bool SetText(std::string param) {
:
:
とか書くレベルです。凡ミスというレベルでは無く、素で書きます。
オマエJavaグラマーとかだろ? C++ナメてんだろ?
…ダミだこりゃ。(´・ω・`)
コメント
コメントの投稿