fc2ブログ

ネタつつき29ー私の頭の中の小人さんたち

どうやら私はかなり特異な存在らしく、私が普通だと考えている事でも世間ではありえないという事が多いらしいです。それで私の事を書いたら面白いと思いましたのでこの記事を書きます。
ネタつつき26-システム構築屋のお仕事で書いたとおり私は変ったお仕事をしております。多分そのせいなのでしょうが、私の開発技法も変っているとよく言われ、理解されない事がよくあります。その原因はおそらく私の思考法だと思います。
私はシステム構築屋という仕事柄、頭の中に小人を沢山住まわせて居ます。その小人たちはそれぞれ何らかの専門家です。小人達はそれぞれ、システムエンジニア、ネットワークエンジニア、データベースエンジニア、セキュリティエンジニア、各種言語のプログラマ、プロジェクトリーダー、OS研究家、コンパイラ研究家、発明家、テスト屋です。お客様と会話する(もしくは仕様書を読む)のとほぼ同じスピードで、それぞれの小人さん達は働き始めます。さらに、もう一つの頭の中ではマトリックス状態となります。つまり、小人さん達が分析・設計・実装と全ての工程を行う事により現実をシミュレートするのです。ちなみに、これらの小人さんは自律しているので、各人が勝手に意見や質問をします。この様に書くと非常にファンタジーですが、噛み砕いて言えばたいした事ありません。単一CPU(脳みそ)で動くマルチタスクOSなわけです。
私の中はこの状態で小人さん達が色々意見を言ってきますので、私は会議などで多くの質問や発言をします。その内容を大分すると、システムを構築する上で足りない情報シミュレート結果です。文章では分かり難いと思いますので、よくある小人さん達の意見を列挙します。


【ネットワークエンジニア小人さんの質問】
  • 業務の忙しい時間帯は?
  • 普段の業務量と最繁時の業務量は?
  • それぞれの部門に何人居ますか?
  • オフィスのレイアウトは?
  • 現在のインフラの状態は?

【データベースエンジニア小人さんの質問】
  • 社員は複数の業務に従事していますか?
  • どの程度データを保存しますか?
  • 既存のデータ(書類等も含む)を見せてください。
  • どの程度部門間連携しますか?
  • 企業レベルでの言葉の標準化はしていますか?

【セキュリティエンジニア小人さんの意見や質問】
  • セキュリティ教育は誰がしますか?
  • 各データの重要度は?
  • どの程度のセキュリティレベルにしますか?
  • 内部がお留守だぜ。

【プログラマ小人さんの意見】
  • 業務手順が曖昧すぎる。
  • 機能要件が曖昧すぎる。
  • 今の仕様だとシステムがすぐ止まりますぜ旦那。

【プロジェクトマネージャ小人さんの意見】
  • システム開発時間が短すぎます。
  • このスケジュールは新人プログラマの教育期間が考慮されていません・・・
  • またデスマーチするつもりですか?

【シミュレート結果】
  • このプロジェクトは破綻します。
  • もし成功してもこのシステムでは作業効率が下がります。


大体こんな感じです。それらの意見や質問をしがないフリーエンジニアの私一人でするので相手は非常に違和感を感じるようです。さらに悪い事に日本のIT業界は上流へ行くほど素人化する傾向があるようです。ですから、各専門家ならば私の言っている意図が分かる事でも理解されません。また各部門の分業化が進んでいますので、作業時に他の専門分野にあたる意見を言っても通じません。システム開発は全ての専門家が連携しないと成功しないものなのですが・・・
この様に私自身がプロジェクトチームであり、実際に今まで二桁のシステムを構築してきましたのでこう思います。上流/下流の区分は不要であり、常に各専門家が協議しなければならないと・・・私はこれをしないからデスマーチが頻発し、3K職業などと呼ばれるのだと考えております。日本のIT産業はいい加減に上流/下流の区分を取り払い、システム構築の効率だけを考えて仕事をするべきだと思います。
スポンサーサイト



テーマ : 情報処理技術
ジャンル : コンピュータ

中の人の徒然草128

今日は雨が降っているから散歩に行けないインドリです。雨はいい雰囲気を醸し出す時があるので嫌いと言うわけじゃないのですが濡れるのは嫌です。なので、今日も色々なジャンルの音楽を聴きながらプログラミングでもします。あと数学と英語もいいかもしれませんね。
英語と言えば、非常に修得し辛いですね・・・プログラミング言語ならば、分厚い専門書一冊買ってきて、リファレンスと共に一度精読したら分かるのに・・・それなのに、たった400ページの英語の本(大学入試用の文法の本)に苦戦しています。とっても歯痒いです!今とっても英語のセンスが欲しいです。情報処理技術ならば一回読んだら大概わかりますし他の教科も情報処理ほどではありませんが短期間で分かります。ですから、やっぱり嫌いという心が修得を困難にしているのでしょう。非常に厄介です。英語の独特なリズムが私の記憶力と理解力を狂わします。それか、私は純日本人だからやっぱり逆に考える英語は相性が悪いのかもしれませんね。
あっそうそう。私が書いた記事「VB.NETで仮想CPUを作ろう(14) - 機械語駆動式 関数電卓を作ろう! 解答編(後半)」 がCodeZineに掲載されているので是非見てね♪

テーマ : 裏事情
ジャンル :

書籍をつつく77-プログラミング言語 Ruby。原典になりうる本。

そういえば、Ruby関係の本を余り紹介していなかったピヨッ♪ということで・・・
プログラミング言語 Ruby
これお勧め♪目次を見るとその丁寧さが分かると思うピヨ♪


【目次】
著者まえがき
はじめに

1章	イントロダクション
    1.1 Rubyひとめぐり
        1.1.1 Rubyはオブジェクト指向言語
        1.1.2 ブロックとイテレータ
        1.1.3 Rubyの式と演算子
        1.1.4 メソッド
        1.1.5 代入
        1.1.6 記号のサフィックス、プレフィックス
        1.1.7 正規表現と範囲
        1.1.8 クラスとモジュール
        1.1.9 意外感の残るRubyの機能
    1.2 Rubyを使ってみよう
        1.2.1 Rubyインタープリタ
        1.2.2 出力の表示
        1.2.3 対話的Rubyのirb
        1.2.4 Rubyのドキュメントを表示するri
        1.2.5 Rubyパッケージ管理のgem
        1.2.6 Rubyのその他のチュートリアルについて
        1.2.7 Rubyリソース
    1.3 本書について
        1.3.1 本書の読み方
    1.4 Rubyによる数独ソルバ

2章	Rubyプログラムの構造と実行
    2.1 字句構造
        2.1.1 コメント
        2.1.2 リテラル
        2.1.3 記号類
        2.1.4 識別子
        2.1.5 キーワード
        2.1.6 空白
    2.2 構文構造
        2.2.1 Rubyのブロック構造
    2.3 ファイル構造
    2.4 プログラムのエンコーディング
        2.4.1 プログラムのエンコーディングの指定
        2.4.2 ソースエンコーディングとデフォルト外部/内部エンコーディング
    2.5 プログラムの実行

3章	データ型とオブジェクト
    3.1 数値
        3.1.1 整数リテラル
        3.1.2 浮動小数点数リテラル
        3.1.3 Rubyの算術演算
        3.1.4 2進浮動小数点数と丸め誤差
    3.2 文字列
        3.2.1 文字列リテラル
        3.2.2 文字リテラル
        3.2.3 文字列演算子
        3.2.4 文字や部分文字列へのアクセス
        3.2.5 文字列の反復処理
        3.2.6 文字列のエンコーディングとマルチバイト文字
    3.3 配列
    3.4 ハッシュ
        3.4.1 ハッシュリテラル
        3.4.2 ハッシュ値、等値性、ミュータブルなキー
    3.5 範囲
        3.5.1 範囲のメンバかどうかのテスト
    3.6 シンボル
    3.7 true、false、nil
    3.8 オブジェクト
        3.8.1 オブジェクト参照
        3.8.2 オブジェクトの寿命
        3.8.3 オブジェクト識別子
        3.8.4 オブジェクトのクラスと型
        3.8.5 オブジェクトの等値性
        3.8.6 オブジェクトの順序
        3.8.7 オブジェクトの変換
        3.8.8 オブジェクトのコピー
        3.8.9 オブジェクトの永続化
        3.8.10 オブジェクトのフリーズ
        3.8.11 オブジェクトの汚染状態

4章	式と演算子
    4.1 リテラルとキーワードリテラル
    4.2 変数参照
        4.2.1 未初期化変数
    4.3 定数参照
    4.4 メソッド呼び出し
    4.5 代入
        4.5.1 変数への代入
        4.5.2 定数への代入
        4.5.3 属性と配列要素への代入
        4.5.4 自己代入
        4.5.5 多重代入
    4.6 演算子
        4.6.1 単項+、-
        4.6.2 指数: **
        4.6.3 算術演算子: +、-、*、/、%
        4.6.4 シフトと追加: <<、>>
        4.6.5 補数、ビット単位AND、ビット単位OR、ビット単位XOR: ~、&、|、^
        4.6.6 比較: <、<=、>、>=、<=>
        4.6.7 等値: ==、!=、=~、!~、===
        4.6.8 論理演算子: &&、||、!、and、or、not
        4.6.9 範囲とフリップフロップ: ..、...
        4.6.10 条件: ?:
        4.6.11 代入演算子
        4.6.12 defined?演算子
        4.6.13 文修飾子
        4.6.14 演算子ではない記号

5章	文と制御構造
    5.1 条件分岐
        5.1.1 if
        5.1.2 修飾子としてのif
        5.1.3 unless
        5.1.4 case
        5.1.5 ?:演算子
    5.2 繰り返し
        5.2.1 whileとuntil
        5.2.2 修飾子としてのwhile、until
        5.2.3 for/inループ
    5.3 イテレータとEnumerableオブジェクト
        5.3.1 数値イテレータ
        5.3.2 Enumerableオブジェクト
        5.3.3 カスタムイテレータの書き方
        5.3.4 Enumerator
        5.3.5 外部イテレータ
        5.3.6 反復処理と同時変更
    5.4 ブロック
        5.4.1 ブロックの構文
        5.4.2 ブロックの値
        5.4.3 ブロックと変数のスコープ
        5.4.4 ブロックへの引数渡し
    5.5 制御フローの変更
        5.5.1 return
        5.5.2 break
        5.5.3 next
        5.5.4 redo
        5.5.5 retry
        5.5.6 throwとcatch
    5.6 例外と例外処理
        5.6.1 例外クラスと例外オブジェクト
        5.6.2 raiseによる例外の生成
        5.6.3 rescueによる例外処理
        5.6.4 else節
        5.6.5 ensure節
        5.6.6 メソッド、クラス、モジュール定義のrescue
        5.6.7 文修飾子としてのrescue
    5.7 BEGINとEND
    5.8 スレッド、ファイバ、継続
        5.8.1 並列実行のためのスレッド
        5.8.2 コルーチンのためのファイバ
        5.8.3 継続

6章	メソッド、proc、lambda、クロージャ
    6.1 単純なメソッドの定義
        6.1.1 メソッドの戻り値
        6.1.2 メソッドと例外処理
        6.1.3 オブジェクトからのメソッド呼び出し
        6.1.4 特異メソッドの定義方法
        6.1.5 メソッド定義の解除
    6.2 メソッド名
        6.2.1 演算子メソッド
        6.2.2 メソッドの別名
    6.3 メソッドとかっこ
        6.3.1 省略可能なかっこ
        6.3.2 必須のかっこ
    6.4 メソッド引数
        6.4.1 引数のデフォルト値
        6.4.2 可変長引数リストと配列
        6.4.3 実引数から仮引数へのマッピング
        6.4.4 名前付き引数のハッシュ
        6.4.5 ブロック引数
    6.5 Proc
        6.5.1 Procの作り方
        6.5.2 Procの実行
        6.5.3 Procの項数
        6.5.4 Procの等値性
        6.5.5 procとlambdaの違い
    6.6 クロージャ
        6.6.1 クロージャと共有変数
        6.6.2 クロージャと束縛
    6.7 Methodオブジェクト
        6.7.1 UnboundMethodオブジェクト
    6.8 関数プログラミング
        6.8.1 Enumerableへの関数の追加
        6.8.2 関数の合成
        6.8.3 関数の部分適用
        6.8.4 関数のメモ化
        6.8.5 Symbol、Method、Proc

7章	クラスとモジュール
    7.1 単純なクラスの定義方法
        7.1.1 クラスの作成
        7.1.2 Pointのインスタンス生成
        7.1.3 Pointの初期化
        7.1.4 to_sメソッドの定義
        7.1.5 アクセッサと属性
        7.1.6 演算子の定義
        7.1.7 []による配列、ハッシュアクセス
        7.1.8 座標の数え上げ
        7.1.9 Pointの等値性
        7.1.10 Pointの順序
        7.1.11 ミュータブルなPoint
        7.1.12 手っ取り早いミューテータクラス
        7.1.13 クラスメソッド
        7.1.14 定数
        7.1.15 クラス変数
        7.1.16 クラスインスタンス変数
    7.2 メソッドの可視性: public、protected、private
    7.3 サブクラス化と継承
        7.3.1 メソッドの継承
        7.3.2 メソッドのオーバーライド
        7.3.3 チェイニングによる動作の補完
        7.3.4 クラスメソッドの継承
        7.3.5 継承とインスタンス変数
        7.3.6 継承とクラス変数
        7.3.7 定数の継承
    7.4 オブジェクトの作成と初期化
        7.4.1 new、allocate、initialize
        7.4.2 ファクトリメソッド
        7.4.3 dup、clone、initialize_copy
        7.4.4 marshal_dumpとmarshal_load
        7.4.5 シングルトンパターン
    7.5 モジュール
        7.5.1 名前空間としてのモジュール
        7.5.2 ミックスインとしてのモジュール
        7.5.3 インクルードできる名前空間モジュール
    7.6 モジュールのload、require
        7.6.1 ロードパス
        7.6.2 ロードされたコードの実行
        7.6.3 モジュールの自動ロード
    7.7 特異メソッドと特異クラス
    7.8 メソッドの探索
        7.8.1 クラスメソッドの探索
    7.9 定数の探索

8章	リフレクションとメタプログラミング
    8.1 型、クラス、モジュール
        8.1.1 祖先とモジュール
        8.1.2 クラス、モジュールの定義
    8.2 文字列とブロックの評価
        8.2.1 Bindingとeval
        8.2.2 instance_evalとclass_eval
        8.2.3 instance_execとclass_exec
    8.3 変数と定数
        8.3.1 変数の取得、設定、テスト
    8.4 メソッド
        8.4.1 メソッドのリストアップと有無のテスト
        8.4.2 Methodオブジェクトの取得
        8.4.3 メソッドの呼び出し
        8.4.4 メソッドの定義、定義解除、別名の定義
        8.4.5 未定義メソッドの処理
        8.4.6 メソッドの可視性の設定
    8.5 フック
    8.6 トレーシング
    8.7 ObjectSpaceとGC
    8.8 カスタム制御構造
        8.8.1 実行の先延ばしと反復: afterとevery
        8.8.2 同期ブロックによるスレッドセーフの実現
    8.9 method_missingとconst_missingの活用
        8.9.1 const_missingによるUnicodeコードポイント定数の作成
        8.9.2 method_missingによるメソッド呼び出しのトレーシング
        8.9.3 委譲によるオブジェクトの同期
    8.10 メソッドの動的な作成
        8.10.1 class_evalによるメソッド定義
        8.10.2 define_methodによるメソッド定義
    8.11 エリアスチェイン
        8.11.1 ファイルのロード、クラスの定義のトレーシング
        8.11.2 スレッドセーフを実現するためのエリアスチェイン
        8.11.3 トレーシングのためのメソッドチェイン
    8.12 ドメイン固有言語(DSL)
        8.12.1 method_missingによる単純なXML出力
        8.12.2 メソッド生成による有効なXMLの出力

9章	Rubyプラットフォーム
    9.1 文字列
        9.1.1 文字列の整形
        9.1.2 バイナリ文字列のパック、アンパック
        9.1.3 文字列とエンコーディング
    9.2 正規表現
        9.2.2 正規表現ファクトリメソッド
        9.2.3 正規表現の構文
        9.2.4 正規表現によるパターンマッチ
    9.3 数値と数学
        9.3.1 Numericのメソッド
        9.3.2 Mathモジュール
        9.3.3 10進演算
        9.3.4 複素数
        9.3.5 有理数
        9.3.6 ベクトルと行列
        9.3.7 乱数
    9.4 日付と時刻
    9.5 コレクション
        9.5.1 Enumerableオブジェクト
        9.5.2 配列
        9.5.3 ハッシュ
        9.5.4 集合
    9.6 ファイルとディレクトリ
        9.6.1 ファイルとディレクトリ名
        9.6.2 ディレクトリリスト作成
        9.6.3 ファイルのテスト
        9.6.4 ファイルとディレクトリの作成、削除、名称変更
    9.7 入出力
        9.7.1 ストリームの開きかた
        9.7.2 ストリームとエンコーディング
        9.7.3 ストリームからの読み出し
        9.7.4 ストリームへの書き込み
        9.7.5 ランダムアクセスメソッド
        9.7.6 ストリームの閉じ方、フラッシュ、テスト
    9.8 ネットワーキング
        9.8.1 非常に簡単なクライアント
        9.8.2 非常に簡単なサーバ
        9.8.3 データグラム
        9.8.4 より複雑なクライアント
        9.8.5 多重化サーバ
        9.8.6 Webページのフェッチ
    9.9 スレッドと並列処理
        9.9.1 スレッドのライフサイクル
        9.9.2 スレッドと変数
        9.9.3 スレッドのスケジューリング
        9.9.4 スレッドの状態
        9.9.5 スレッドとスレッドグループのリストの作成
        9.9.6 スレッドのサンプル
        9.9.7 スレッドの排他処理とデッドロック
        9.9.8 QueueとSizedQueue
        9.9.9 条件変数とQueue

10章	Ruby環境
    10.1 Rubyインタープリタの起動オプション
        10.1.1 一般的なオプション
        10.1.2 警告と情報のオプション
        10.1.3 エンコーディングオプション
        10.1.4 文字列処理オプション
        10.1.5 その他のオプション
    10.2 トップレベル環境
        10.2.1 定義済みモジュールとクラス
        10.2.2 トップレベル定数
        10.2.3 グローバル変数
        10.2.4 定義済みグローバル関数
        10.2.5 ユーザー定義グローバル関数
    10.3 実用的な抽出と報告のためのショートカット
        10.3.1 入力関数
        10.3.2 使うべきでない抽出関数
        10.3.3 レポート関数
        10.3.4 1行スクリプトのためのショートカット
    10.4 OS呼び出し
        10.4.1 OSコマンドの実行
        10.4.2 子プロセスの作成
        10.4.3 シグナルのトラップ
        10.4.4 プログラムの終了
    10.5 セキュリティ
        10.5.1 汚染状態のデータ
        10.5.2 制限実行とセーフレベル

索引


この本はRuby使いには絶対お勧めなんだ。何故かと言うと、まつもと ゆきひろ氏がRuby1.9について書いてあるからなんだ。というのも、プログラミング言語を習得する上で大事なのは、その言語の設計思想を学ぶ事だからね。どんなソフトウェアでもそうなんだけど、作者は目的をもって設計しているピヨ。その設計思想を理解すると言う事は、そのソフトウェアを根源から理解すると言う事に繋がるんだ。だから、コンパイラ屋さんにも、プログラマにも皆にお勧めするピヨ♪特に初心者は作者本人の本を読む事をお勧めするピヨ♪設計思想を感じる訓練をする事は非常に大事だからね。

テーマ : プログラミング
ジャンル : コンピュータ

Javaをつつく5-if文。上から来たものを左右へ捌く!

今回は制御構文の一つであるif文をつつくピヨ♪おっと、制御構文の説明がまだだったよね。制御構文とは何かという事について囀るピヨ♪プログラムは普通、上から下へと処理を実行していくだけなんだ。だけどそれだけじゃあ満足できないよね。だって、「在庫数がマイナスになった時の処理」とか「ボタンが押されたらどうする」とか・・・色々な処理が要るピヨ。そこで考え出されたのが制御構文なんだ。この構文を使うと上から下以外の流れに出来るピヨッ♪
理屈ばかりじゃあ面白くないから早速プログラムをつつこう♪


public class BigOrSmall {
    
    public static void main( String args[] ) {
    
        //先ずはぼちぼちする
        int number = 0;
        if ( number < 0 ) {
            System.out.println( "マイナス値なんて後ろ向き過ぎるピヨッ" );
            System.out.println( "もっと大きくいこう♪" );
        } else if ( number < 50 ) {
            System.out.println( number + "は小さい数値ピヨ♪" );
        } else {
            System.out.println( number + "は大きい数値ピヨ♪" );
        }
        
        //ちょっと落ち込んだ
        number = -100;
        if ( number < 0 ) {
            System.out.println( "マイナス値なんて後ろ向き過ぎるピヨッ" );
            System.out.println( "もっと大きくいこう♪" );
        } else if ( number < 50 ) {
            System.out.println( number + "は小さい数値ピヨ♪" );
        } else {
            System.out.println( number + "は大きい数値ピヨ♪" );
        }
        
        //小さいから数値を変更♪
        number = 50;
        if ( number < 0 ) {
            System.out.println( "マイナス値なんて後ろ向き過ぎるピヨッ" );
            System.out.println( "もっと大きくいこう♪" );
        } else if ( number < 50 ) {
            System.out.println( number + "は小さい数値ピヨ♪" );
        } else {
            System.out.println( number + "は大きい数値ピヨ♪" );
        }
    }
}


どう?if文がなんとなく分かったかな?一応説明しておくね。if文は・・・


if ( 条件 ) {
    //条件を満たした時の処理
} else if ( 他の条件 ) {
    //前とは違う条件を満たした時の処理
} else {
  //全ての条件を満たしていない時の処理
}


という具合で記述するピヨ♪この文は基礎中の基礎だけど、非常に使用頻度が高いからしっかりと覚えておこう。制御構文を疎かにする者はプログラミング出来ないピヨッ!プログラミングを始めた頃は高度な構文が使いたくなるものだけど、基礎が一番大事なのであせらずしっかりとマスターしよう♪今回はこれでおしまい♪

テーマ : プログラミング
ジャンル : コンピュータ

ネタつつき28-言語進化の鍵はCOBOLが握っているのかもしれない。

私はコンパイラやOSなどのシステムソフトを研究していますので、コンパイラについて毎日色々考えていました。するとやっぱり頭に浮かぶのは最近の言語の新機能がつまらない事です。新機能が色々追加されていますので言語が進化していると錯覚しがちなのですが、表面上が変っただけで 昔からある機能の焼き直しばかりです。LINQとか大規模な機能の追加もありますが、 LINQは想定の範囲内なので余り面白くありませんでした。これは一言で乱暴に言うとオブジェクト指向SQL埋め込みです。これに似たものを私はADOの時代に既に発明していました。ですから研究者としては面白くないのです。後は大半はLISP等の関数型言語から拝借した概念ばかりです。まったく好奇心が湧かないわけではありませんがもっとサプライズが欲しいです。
私はこの傾向が気になって何日も考えていました。すると一つの仮説が思い浮かびました。それは、 言語利用者がそれを求めているのではないかという事です。C#などの開発でよく使う言語は商業用の物です。という事は、新しい概念が出現しないのは、購買している我々開発者や会社がそれを求めているのといっても良いかと思います。そう考えれば思い当たる節が沢山あります。
会社は保守性という言い分けの元教育を放棄して言語のフル機能を使わせません。そして、技術者もサボりたいのでそれを容認している節があります。本来プロは業務に適した道具を選びます。しかしこの業界の体質は、自社の都合だけを考えて色々な事を禁止します。やれ、関数型言語は使うな、三項演算子は使うな、C#は使うな、C++は使うな、多重継承は使うな、テンプレートは使うな・・・。多くの有用な言語やその機能が保守性を免罪符にした会社や技術個人の怠慢により殺されています。それらの禁止事項は大半が怠慢の産物であって論理はありません。そもそも、必要だから生まれた言語や機能を禁止する事態がおかしいのです。
少し話しはづれますが、保守性を言い分けにする会社や人が多いので一応その事に触れておきます。保守性というのは本来プロが正しく美しいプログラムを書くことを意味しております。プロとして常識的なコードを書けということであって、決して素人に毛が生えた程度の人を想定した概念ではありません。現在の様に「○○は新人は分からない」という馬鹿げた理屈でコーディングをしていればそのうち、RDBMSは難しいから使わない、オブジェクト指向は難しいから使わない・・・と、どんどん低レベル化していきます。これでは最早プロとは呼べません。プロは技術力を鍛えるものであって、退化することを目標とするのは馬鹿げています。そんな怠惰で馬鹿な人が作った商品は誰も要りません。
もう十分だと思いますので話しを戻します。このような怠惰精神が購買側に広がればコンパイラを売る方としては当然既存概念の延長線上のものしか作れなくなります。せっかく新しい概念の言語や機能を作ってもお客様に拒否されては商売になりませんからね・・・非常に悲しい事ですが商業的要素は免れません。
では昔はどうだったのかと言いますと、新しい概念や機能がどんどん発明されていました。C++はオブジェクト指向の新しい形を提示し、テンプレートなどの画期的な機能を取り入れましたし、FORTRANやCOBOLなどの特定の分野を想定した言語なども作られてきました。私はこれこそがプロの道具としてのコンパイラのあるべき姿だと思います。昨今は都合や勘で選んだ言語に作るものを無理やり合わせていますが、本来道具は作る物に合わして選ぶべきです。誤解されそうなので書いておきますが、かといって一つの言語を究める道を否定するものではありません。とはいえ、それは個人での話しです。特定の技術に特化した人はチーム開発にとって必要な人材です。しかし、会社全体がそんな事をすればシステムの品質が下がるのは目に見えています。システム開発は色々な道具を使ってするものです。特定の言語の特定機能だけを使って作れるものではありません。そんな事をすれば被害を受けるのはエンドユーザーや何も知らない一般人です。どんなに悪い品質でも売ったらよいという考えは私は納得できません。それはプロの考えではなく犯罪者の考え方です。
長くなりましたのでそろそろ纏めます。言語の進化はドメイン特化型の方向もあるべきです。現在の様に無難に「皆一緒に同じ機能をつけましょう」では進化は望めません。COBOLの様な個性の強い特化型言語をどんどん作るべきです。そして、技術者も進化を恐れずに学び続けましょう。前に進まなければ滅ぶのは目に見えているのですから・・・

テーマ : 情報処理技術
ジャンル : コンピュータ

中の人の徒然草127

やったぁー♪仕事の合間にやっとCodeZineの新連載を描き終えました♪新連載では、解説する分野を変更している上、非常に情報が多い分野でしたので、情報の選択が大変でした。どんな学問でも同じだと思うのですが、情報量は膨大でも視点に応じて必要な情報は違うはずです。結局は全てを学ぶ事になりますが、初めから大量の情報を流すとWeb系記事では駄目なので非常に苦労しました。もう何度も消したり書いたりの繰り返しでした。その作業で実感したのですが、情報を羅列するのではなく必要最低限に絞ってそれを記事にするとなると大変ですね。せっかく苦労して描いたので次の連載も人気があったらいいな・・・
最近記事の投稿数が減っていましたが、CodeZine記事を書き終えたのでまたどんどん書いていきます。お楽しみに♪

テーマ : 裏事情
ジャンル :

書籍をつつく76-アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法。気になる一品。

今日は凄く気になる本を見つけたピヨ♪
アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~
フリーエンジニアや、プロジェクトマネージャとかは見積もり気になるよね?


【目次】
イントロダクション

第1部 問題とゴール
1章 計画の目的
2章 なぜ計画づくりに失敗するのか
3章 アジャイル手法

第2部 規模を見積もる
4章 ストーリーポイントによる規模の見積り
5章 理想日による見積り

6章 見積りの技法
7章 再見積り
8章 ストーリーポイントと理想日

第3部 価値のための計画づくり
9章 テーマの優先順位づけ
10章 金銭価値による優先順位づけ
11章 「 望ましさ」による優先順位づけ
12章 ユーザーストーリーの分割

第4部 スケジュールを立てる
13章 リリース計画づくりの基本
14章 イテレーション計画づくり
15章 イテレーションの長さを決める
16章 ベロシティの見積り
17章 不確実性に備えるバッファの計画
18章 複数チーム編成プロジェクトの計画づくり

第5部 トラッキングと情報共有
19章 リリース計画のモニタリング
20章 イテレーション計画のモニタリング

第6部 なぜアジャイルな計画づくりがうまくいくのか
22章 なぜアジャイルな計画づくりがうまくいくのか

第7部 ケーススタディ
23章 ケーススタディ:ボムシェルタースタジオ

リファレンス・リスト
訳者あとがき


この本は見積もりに関する本ピヨ♪ボクが思うに、IT業界って見積もりにルーズなところがあるピヨ。だって、人月単価が駄目だと前世紀に言われているのに未だに止めないよね。そういったルーズな見積もり法を変えるには、見積もりもアジャイルにするしかないとボクは思う。この本は丁度ボクの考えと一致しているから購入予定本リストに加えるピヨ♪
まだ予約段階で読んでいないから確かな事はいえないけど、 見積もり本は貴重だから見積もりが必要な人は買う価値があると思うピヨ。でも一つ気になるところがある。目次を拝見すると、システムの価値を測る項目がないピヨォ。ボクは職人肌だから、システム品質をはかり、それに基づき見積もりを立てる手法を解説して欲しいピョ。

テーマ : 情報処理技術
ジャンル : コンピュータ

中の人の徒然草126

今日も寒いですねー♪布団から這い出すのが大変でした♪皆様は如何お過ごしでしょうか? 私は相変わらずの毎日です。そういった平凡な日常が幸せです。
そうそう、話しは変りますが今日はVB.NETで仮想CPUを作ろう(13) - 機械語駆動式 関数電卓を作ろう! 解答編(前半)がCodeZineにて掲載されます。是非是非読んでください。みんな、機械語駆動式関数電卓作ってくれたかな?作った人は私のコードと見比べたら面白いと思います。もし作っていない場合は、なるべく作ってから読んで欲しいなー♪クイズの答え先に見てしまったら面白くないからね。でもどうしても分からない部分があるのならば、その部分だけ読んで欲しいな♪

テーマ : 裏事情
ジャンル :

ネタつつき27-言語仕様拡張の難しさ

今回は、アクセス修飾子の記事で複数の技術者とやり取りして気付いた話題を取り上げます。言語仕様を追加すると言う行為は、一般的なプログラマが考えているよりも複雑で厄介なものです(参考資料:C++の設計と進化)大まかに言うと、時間・環境・実装の三つの要素が絡み合って発生する様々な困難さが付きまとうのです。この手の問題について知らない人もいるかと思いますので、先ずはそれらの問題について簡潔に書きます。
一つ目は実装について書きます。普通の人の感覚では実装は関係ないと考えるでしょう。しかし、実際にコンパイラを作ってみるとわかりますが、言語に構文を追加すると思わぬ問題が生じます。例えば、演算子を言語仕様に追加したとします。この時よく考えないと、想像もつかないほどの問題が生じます。演算子を追加すると言う事は、過去のプログラムの演算結果が変化してはならないことを意味します。そうしないと、再コンパイル時にテスト済みのソフトがバグってしまいます!嗚呼、何ということでしょう!匠に相談しなければなりません。
二つ目の要素は時間です。言語仕様は時間が経てば経つほど、過去のしがらみが発生します。何故ならば、仕様策定後に世界中でソフトウェアが作られているからです。それら既存のプログラムに対する重大な責任がありますので、過去のプログラムが動かなくなるようなものは仕様として追加できません!
最後の要素は環境です。これはOSやプロセッサをイメージしてもらえばいいかと思います。今のところ、SQLの様にレベルわけされている言語もありますが、基本的に多くの言語は環境を特定していません。という事は、PC用のOSも、パームトップ型のプロセッサも、さらには医療用ナノマシン用にもその言語は使えなくてはなりません。言語仕様に関わる人は大変ですね。
これはあくまでも大まかな問題です。もっとマイナーなAPIやABIに関わる問題もありますし、ヒューマン的な問題もあります。この互換性的な問題の影響は非常に大きく、多くの人が使っているx86の仕様が複雑なのもそれが原因です。x86は評判どおり汚い部分もありますので、口が悪い人達は「知恵遅れまで継承している」なんて酷評されています。しかし、プロセッサの仕様を変えてしまえばOSすらも動かなくなる事を考えると私はIntelを責められません。
このように言語一つ拡張するのも大変ですが現実はどうでしょうか?「最近の若い者は言葉使いがなっとらん!」と古代エジプト時代から言われておりますが、人間同士は何とか通じ合っています。その差は一体何なのでしょう?私が思うに抽象度が影響しているのではないでしょうか?ハードウェアとソフトウェアが変更に弱いのは予め動的なものとして考えられていないのが原因だと思います。言語は決して静的なものではありません。使えば使うほど進化していきます。これを考慮して、ビャーネ氏は出来るだけライブラリ(語彙)を追加する方向を勧めているのでしょう。過去の情報処理技術を考えるとそれは合理的な考え方です。しかし今のままでは不便な点が数多く存在しますので、情報処理技術を愛し無限の進化を求める私としては不満です。
ではどうすればいいのかと申しますと、これはあくまでも未熟な私の個人的見解なのですが、言語のライフサイクルそのものを一つの情報集合として考え直すしかないでしょう。これは複雑な問題であり、昨日今日解決できる問題はありません。言語策定プロセスそのものを分析してプログラミングするべき時期に来ているのではないでしょうか?

テーマ : 情報処理技術
ジャンル : コンピュータ

書籍をつつく75-詳解TCP/IP Vol.2と3。TCP/IP実装本。

ボクは大好きなんだけど、読み手を選ぶかもしれない名著が
詳解TCP/IP〈Vol.2〉実装
詳解TCP/IP〈Vol.3〉トランザクションTCP、HTTP、NNTP、UNIXドメインプロトコルピヨ♪


【目次】
Vol2
■目次
1 導入
2 mbuf: メモリバッファ
3 インタフェース層
4 インタフェース:イーサネット
5 インタフェース:SLIP とループバック
6 IPアドレス
7 ドメインおよびプロトコル
8 IP:インターネットプロトコル
9 IPオプション処理
10 IPフラグメンテーションと再組立て
11 ICMP:インターネット制御メッセージ プロトコル
12 インタフェース:SLIP とループバック
13 I G M P : インターネットグループ マネージメントプロトコル
14 IPマルチキャストルーティング
15 ソケット層
16 ソケットI/O
17 ソケットオプション
18 ラディックスツリールーティングテーブル
19 ルーティング要求とルーティングメッセージ
20 ルーティングソケット
21 ARP:アドレス解決プロトコル
22 プロトコルコントロールブロック
23 UDP:ユーザデータグラムプロトコル
24 TCP:トランスミッションコントロール プロトコル
25 TCPタイマ
26 TCP出力
27 TCP関数
28 TCP入力(1)
29 TCP入力(2)
30 TCPユーザ要求
付録A 練習問題の解答
付録B ソースコードの入手方法

Vol3
・第1部 トランザクションのためのTCP
第1章 T/TCPの紹介
第2章 T/TCPプロトコル
第3章 T/TCPの例題
第4章 T/TCPプロトコル(続き)
第5章 T/TCPの実装:ソケットレイヤ
第6章 T/TCPの実装:ルーティングテーブル
第7章 T/TCPの実装:プロトコル制御ブロック
第8章 T/TCPの実装:TCPの概要
第9章 T/TCPの実装:TCP出力処理
第10章 T/TCPの実装:TCP関数
第11章 T/TCPの実装:TCP入力処理
第12章 T/TCPの実装:TCPユーザリクエスト

・第2部 TCPアプリケーション
第13章 HTTP:ハイパーテキスト転送プロトコル
第14章 HTTPサーバで見いだされるパケット
第15章 NNTP:ネットワークニュース転送プロトコル

・第3部 Unixドメインプロトコル
第16章 Unixドメインプロトコル:紹介
第17章 Unixドメインプロトコル実装
第18章 UnixドメインプロトコルI/Oとディスクリプタパッシング

付録A ネットワーク時間を計測する
付録B T/TCPを使ったアプリケーションのコーディング


この本はFreeBSD4.4におけるTCP/IPの実装を解説した本ピヨ♪ これを聞いたら「FreeBSDは俺には関係ねぇ!」と思われるかもしれないけど、この実装は多くのOSが参考にしたコードだから読む価値は十二分にあると思うピヨ♪とはいえ残念ながら情報が古い点は否めない。実際にLinuxカーネルを解析したり、Windowsでの実装を考えたりする上では参考イメージとして読む事をお勧めするピヨッ。
この本をお勧めする対象は、OSの実装技術やTCP/IPの深い知識を求める人ピヨ。こういった人にとってはこの本は待望の本といっても過言ではないと思う。だけど、万人にお勧めできるかと問われたら否ピヨ。普通に開発業務をしている人にはここまでの情報は要らないと思う。だからVol1とは別にレビューをしたんだ。そういえば最近この手の本は発売されていない。誰か執筆して欲しいな。絶対に売れると思うんだけど・・・

テーマ : 情報処理技術
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター