無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

プログラマ募集

プログラマ募集中 です。

転職先を募集したときに結構反応をいただいたので、それに味をしめて
人材募集をしてみました。はたして反応があるんでしょうか。

メールをお待ちしております。
PageTop

社会人の技術レベル その2

社会人の技術レベル のつづき

へにかさんのコメント:
> ある程度枯れたソースを流用したほうが、トラブルが少ない、という理由
> かも知れません。

ごもっともです。
 - コピペによる短期的な修正量削減・リスク軽減をとるか
 - コピペをせずに中・長期的な修正量削減tと、美しい設計による保守コスト削減をとるか
という話なわけで、どちらにするかはそのときの状況判断次第です。

しかし「コピペをせずにすむ技術力を持ちつつ、状況次第ではコピペする」
ならば理解できますが、わたしの見る限り技術力がないのでコピペしかできない
人がほとんどでした。

一般論で終わってしまうのも嫌なので具体的な例を出します。DB からデータを
取得して、CSV ファイル 10個に出力するプログラムがあるとします。10 ファイルを
まとめてオープンする処理を書かせるとします。すると、

  fp1 = fopen(CSV_OUT_1, "w");
  if ( fp1 == NULL ){
    char errmsg[ERRMSG_LEN];
    sprintf(errmsg, "CSVファイルオープンエラー");
    err_fp = fopen(LOGFILE, "a");
    fprintf(err_fp, errmsg);
    fclose(err_fp);
    EXEC SQL ROLLBACK;
    EXEC SQL DISCONNECT;
    exit(1);
  }
  fp2 = fopen(CSV_OUT_2, "w");
  if ( fp2 == NULL ){
    char errmsg[ERRMSG_LEN];
    sprintf(errmsg, "CSVファイルオープンエラー");
    err_fp = fopen(LOGFILE, "a");
    fprintf(err_fp, errmsg);
    fclose(err_fp);
    EXEC SQL ROLLBACK;
    EXEC SQL DISCONNECT;
    fclose(fp1);
    exit(1);
  }
  fp3 = fopen(CSV_OUT_3, "w");
  if ( fp3 == NULL ){
    char errmsg[ERRMSG_LEN];
    sprintf(errmsg, "CSVファイルオープンエラー");
    err_fp = fopen(LOGFILE, "a");
    fprintf(err_fp, errmsg);
    fclose(err_fp);
    EXEC SQL ROLLBACK;
    EXEC SQL DISCONNECT;
    fclose(fp1);
    fclose(fp2); ← ★ここがどんどん増えていくことに注意
    exit(1);
  }
  … 以下 fp4~fp10 略。


というソースを平気で書いたりする。

おいおい、って感じですよね (ちなみに、どのファイルをオープンしようとして
エラーになったのかわからないし、errno も記録していない。ひどいのになると
いきなり exit しておしまいってのもよく見ました)。

わたしなら、

  char *csv_outfile[] = {CSV_OUT_1, CSV_OUT_2, CSV_OUT_3 ... };
  FILE *csv_fp[(csv_outfile)/sizeof(csv_outfile[0])];
  for ( i=0 ; i<sizeof(csv_outfile)/sizeof(csv_outfile[0]) ; i++ ){
    csv_fp[i] = fopen(csv_outfile[i], "w");
    if ( csv_fp[i] == NULL ){
      /* 可変長引数なログ出力関数 logging を作る */
      logging("CSVファイル [%s] オープンエラー。errno[%s]",
              csv_outfile[i], strerror(errno));
      /* わたしはこういう場合は fclose せず OS にまかせますが、まぁ一応 */
      for ( ; i>=0 ; i-- ){
        fclose(csv_fp[i]);
      }
      EXEC SQL ROLLBACK;
      EXEC SQL DISCONNECT;
      exit(1);
    }
  }


と書きます。ログファイルに

  CSVファイル[/foo/bar/hoge.csv](ほげシステム出力用CSV)] オープンエラー。
   errno[Permission Denied]

などとファイルの種類 (ほげシステム~ってところ) を出力したいがために、

  typedef struct {
    char filename[FILE_MAX]; /* ファイル名 */
    char description[256];   /* 説明用文章。エラー発生時などに使用 */
    FILE *fp;
  } csv_info_t;
  csv_into_t csv_info[] = {
    {CSV_OUT_1, "ほげシステム出力用CSV"},
    {CSV_OUT_2, "ほげ料金請求額CSV"},
    {CSV_OUT_3, "ふが料金請求額CSV"},
    ...
  };
  for ( i=0 ; i<sizeof(csv_info)/sizeof(csv_info[0]) ; i++ ){
    csv_info_t *csv_p = &csv_info[i];
    csv_p->fp = fopen(csv_p->filename, "w");
    if ( csv_p->fp == NULL ){
      logging("CSVファイル [%s](%s)オープンエラー。errno[%s]",
      csv_p->filename, csv_p->description, strerror(errno));
      ..
    }
  }


とさらにもう一段抽象化するかもしれません。

もし何かの事情があってファイルオープン処理は 10回書かざるをえないとしても、

  char *csv_outfile[] = {CSV_OUT_1, CSV_OUT_2, CSV_OUT_3 ... };
  FILE *csv_fp[(csv_outfile)/sizeof(csv_outfile[0])];
  memset(csv_fp, NULL, sizeof(csv_fp));
  csv_fp[0] = fopen(CSV_OUT_1, "w");
  if ( csv_fp[0] == NULL ){
    sprintf(errmsg, "CSVファイル [%s] オープンエラー。errno[%s]",
            CSV_OUT_1, strerror(errno));
    goto err;
  }
  csv_fp[1] = fopen(CSV_OUT_2, "w");
  if ( csv_fp[1] == NULL ){
    sprintf(errmsg, "CSVファイル [%s] オープンエラー。errno[%s]",
            CSV_OUT_2, strerror(errno));
    goto err;
  }
  (略)
  return RET_OK;

 err:
  err_fp = fopen(LOGFILE, "a"); /* ログオープンエラー処理略 */
  fprintf(err_fp, "%s\n", errmsg);
  fclose(err_fp);
  for ( i=0 ; i<(sizeof(csv_fp)/sizeof(csv_fp[0]) ; i++ ){
    if ( csv_fp[i] != NULL ){
      fclose(csv_fp[i]);
    }
  }
  EXEC SQL ROLLBACK;
  EXEC SQL DISCONNECT;
  return RET_NG;


などとエラー処理は一箇所にまとめてほしいものです。でもそれすらできません。

新人がしょーもないソースを書くのは仕方がないですが、それを指導するのは
先輩のはず。でも、その先輩にも技術力がないので指摘することができない。

かなりレベルが低い例で恐縮ですが、わたしの言うコピペというのはこういう
情けないレベルの話です。「ある程度枯れたソースを流用」云々以前の問題です。

こういう低レベルな悩みはないのであれば、へにかさんの会社 or 部署のレベルが
高いか、組み込み系全体のレベルが業務系よりは高いのかなぁと思ったりします。

まだまだ続きます。

P.S.
へにかさん、いろいろご心配頂いて申し訳ありません。とりあえず今はとても
楽しくやっております。上記のような汚いソースを書く輩がいたら、
 「こんな汚いソースは初めて見ました」
と言って (嫌な奴)、何度でも書き直させます。
PageTop

PHP の嫌なところ

変数のタイプミス耐性がない。

つまり perl で言うところの use strict 相当の機能がない。

無精なプログラマとしては許せない。いちいちテストしないと怖くて使えないではないか。だから仕事では使わない。
PageTop

社会人の技術レベル

# 注意: ここで言う技術レベルとは、あくまでコンピュータ関連の技術的
# レベルであって、管理スキルやコミュニケーションスキルは含まない。

学生時代、fj や UNIX 関係のメーリングリストを見ていて、社会人
というのは何と技術的なレベルが高いのだろうか、こんな恐ろしい
ところでやっていけるのだろうか、と思っていた。

就職するときは少しでも技術力のある会社に行きたいと思い、1990年代
前半あたりまで UNIX (本物の UNIX ね) を作っていた会社に入ってみた。
「お前は UNIX のことを何も知らないなぁ」と呆れられながらも、少し
ずつ成長していく自分を想像したりした。

というわけでなんとなく業務系 SE になってみたものの、入社後しばらく
すると UNIX や C言語や web に関してわたしより詳しい人は、(少なくとも
同じ部署には) いないことに気づいた。

エラー処理は甘いし、命名 (変数名・プログラム名) は変だし (=物事の
本質を見極めていない)、ソースはコピペばかりで無駄に長いし、言語知識は
全然ないし、UNIX を知らない。そもそも man を見ない。かわりに見るのは
「UNIX ポケットリファレンス」。

データベースなど、それまで未経験だった部分はさすがに先輩の方が
よく知っていたが、そのうち追い抜いてしまった。

わたしは SE だったが、外注としてプロジェクトに参加していた
プログラマのレベルも低かった。なんで顧客対応や進捗管理もしなきゃ
いけない SE が、プログラミング専門でやっているプログラマに「こんな
汚いソースを書くな」と言わなきゃいけないのか。逆だろう。


でも、メーリングリストや web 界隈においては、いまだにわたしの
レベルは低い。まだまだ勉強が足らんと思う。

わたしの師匠はどこにいるんだろうか?

ゲーム系? 組み込み系? パッケージソフト系?

業務系にもいることはいるが、単にわたしの運が悪くて、まわりの人の
レベルが低すぎただけ? あるいはそんな人はどこにもいない? 青い鳥なの
だろうか?

誰か知ってたら教えてください。ほんとに。
PageTop

はじめての blog

blog とかいうものに手を出してみた結果、
fc2 のシステムはダメだということがわかった。

> 希望パスワード (できるだけ類推されにくいパスワードにしてください。)
> (4~10文字 半角英数小文字) 例:aaaa

最小 4文字は少なすぎ。最大 10文字も少なすぎ。
なぜ英大文字や記号が使えないのか。ダメすぎ。

> ブログタイトル (ブログ上で表示するブログのタイトルです。)
> (全角1~40文字)

なぜ全角なのか。本当は 68user's blog にしたかったが、
全角英数字を入力するのは嫌なので、仕方なくあきらめる。

まぁアカウントを作ろうとしたものの、重すぎて作れなかった seesaa
よりマシかもしれない。

というわけでひとつよろしく。
PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。