goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

プログラミング言語が好きです

2025-04-12 20:59:33 | プログラミング

(なんかRustが嫌いみたいなブログがバズったようなので、それに便乗してみるw)

自分はプログラミングやプログラミング言語が好きで、いくつかのプログラミング言語を勉強してきたので、それを振り返る形で書いてみたい。

BASIC

最初に覚えたプログラミング言語はBASIC。

なんと言っても、エディターの起動速度なら一番だろうw
MSX-BASICなら、パソコンを起動すればBASICのエディター画面になるからね!(パソコンの起動時間は、エディターの起動時間には含めないよね?w)

試行錯誤しながら覚えるには、インタープリター言語であるBASICは最適。

行番号を付けて命令を入力すればプログラムとして保存され、RUNと打つだけで実行できる。なんて分かりやすいw

当時は雑誌にプログラムが掲載されていて、それを見ながら手打ちで1文字1文字プログラムを入力していったものだ。
当然打ち間違いが発生して、エラーが発生することもしばしば。
一番の思い出は、長編RPGの長いプログラムを入力して、時間をかけてクリアして、さあエンディングだ!ってなったときにピッとSYNTAX ERRORが出たことかな(爆)
(プログラムを修正して、さすがにゲーム本編をやり直す気はしなかったから、goto文でエンディングに飛ばせた^^;)

アセンブリ言語

アセンブリ言語は、CPUが実際に読み込む機械語に対応したニーモニックで記述する言語。

BASICはインタープリター言語だけあってやはり実行速度が遅いので、アセンブリ言語で書いてアセンブルしたアプリケーションは速くて素晴らしかった。

アセンブリ言語は命令セットがシンプルなので、シンプルな言語が好きな人にはお勧めw

ただ、MSXだと命令を間違うとすぐに青い画面になるから、デバッグは大変かも。
(ここで言う青い画面とは、MSX2や2+の起動画面のこと。起動時に青い画面の中央にMSXの文字が出るのだ。つまり、プログラムが暴走してパソコンがリセットされるという意味^^;)
(それに比べて、Windowsのブルースクリーンはエラー情報を出してくれる分、だいぶマシかも?)

C言語

C言語の便利なところは、何と言ってもポインター。
C言語を勉強するとポインターで躓くという話をよく聞くけれど、アセンブリ言語を学んだ後ならポインターの利便性はよく分かる。
アセンブリ言語では、アドレス(ポインター)が指している先のデータが1バイトなのか2バイト整数なのか文字列なのかといった情報は、プログラマーが管理する必要がある。
しかしC言語では、int* ならそのポインターが指しているデータがintなのがすぐ分かる。とても便利だ。

あと、個人的には記号を駆使しているのが好きだ。代入が=で加算が+、それを合わせて+=とか。インクリメントが++とか。
アセンブリ言語の「ADD A, B」がBASICだと「A = A + B」、C言語だと「A += B」と書ける。
同様に「INC A」がBASICだと「A = A + 1」だがC言語だと「A++」。なんてシンプルなんだ。

Pascal

大学に入って講義で使われたのがPascal。
C言語に似ているけれど、C言語がソースコードの短さを目指しているように感じられるのとは異なり、Pascalは「理論的にこうあるべき」というのを目指した言語という印象。

Lisp

括弧が多いことで有名な言語。

実際、括弧は多い^^;
大学で自分が所属した研究室で独自のLisp実装が作られていたけれど、開き括弧に比べて閉じ括弧が余分にあってもエラーにならないようになっていた。
つまり、プログラムは「(hoge)))))))」みたいに余分な閉じ括弧が常に付けられていた^^; プログラムを変更したときに括弧の対応付けをするのが面倒だったんだろうね^^;

C言語やPascalでは関数呼び出しは「関数名(引数)」という書き方だが、Lispでは「(関数名 引数)」のようになっていて、そんな書き順もいいんだというカルチャーショックのようなものを感じた。

Prolog

大学の講義で聞いただけなので、実際に使ったことは無いんだけど。
第5世代言語とか言われて、人工知能につながると考えられていたっぽい。

BASICやC言語等の汎用的なプログラミング言語とは一線を画していて、こういうのもプログラミング言語って言うんだ…とちょっと思った^^;

Yacc/Lex

大学で学んだことで驚いたことのひとつは、プログラミング言語を作るための言語があるのだということ。

ここでYacc/Lexを勉強したことでで、会社に入ってからDMDL Editorを作ることが出来た。

AWK

大学でYacc/Lexを使ってAWKのインタープリターを作るという実習があって、AWKを勉強した。

なので、UNIX上で文字列を加工したいときは、sed等よりawkの方が慣れているw

C++

C言語にオブジェクト指向を取り入れた言語。(一番最初のC++コンパイラーは、C言語に変換するものだったらしい)

オブジェクト指向の概念は衝撃的だった。
自分もC言語を使っていていくつか不便な点を改善した言語を作りたいなぁと思ったことはあるけど、オブジェクト指向の発想には絶対至れなかったと思う。

自分がオブジェクト指向に一番価値を見出している部分は、クラスの責務の概念。
C++のクラスの元になったのはC言語の構造体だと思うが、構造体のフィールドはどの関数からも更新することが出来る。つまり予期しない場所でも更新するコードが書けてしまう。
それに対し、クラスではフィールド(メンバー変数)にアクセスできるのはクラスのメソッド(メンバー関数)だけ。クラスはフィールドを管理する責務を持つ。別の言い方をすれば、特定のデータを扱う責務を持つのがクラス。責務外のデータにはアクセスしない。
だから、フィールドやメソッドをそのクラスに持たせるかどうか=クラスの責務に合致しているかどうかという判断基準はプログラミングの基礎になると思う。
(責務の考え方は、オブジェクト指向のクラスだけでなく、DBのテーブルとかコンポーネントの切り分け等にも応用できると思う)

SQL

リレーショナルデータベース(RDB)を操作するための言語。

自分は会社に入ってからSQLを覚えた。
大学で「データベース論」だったかな、そういった講義があったんだけど、当時はデータベースが何だか分かってなくて第3正規形とか意味不明だったんだけど、実際にRDBを扱うようになって、ようやくその意味が分かった^^;

DBを操作しようと思ったらDBが提供している独自言語を使った方が実行効率が良いってことはままあると思うけど、SQLが標準的すぎて、SQLが無いDBは使ってもらえない感がある^^;

Java

C++の次に流行った言語。オブジェクト指向を中心に据え、C++の欠点を克服しようとしたのだと思う。

Javaはいろいろ画期的だった。
コンパイルするとCPUが解釈できるバイナリーではなく中間のclassファイルを生成し、JavaVMがclassファイルを読んで実行する。
これにより、コンパイルする環境と実行する環境が同一でなくてもよくなった。
(C++だと、Linuxで動くアプリケーションをWindows上でコンパイルする方法なんて、考えたくない^^;)

しかしJavaVMはある意味インタープリターなので、実行速度が遅くなるという批判があった。
それに対し、JIT(Just In Time)コンパイラーを実現し、Javaは実行速度がかなり速い部類になった。(この成功を受けて、JITは他の言語でも採用されることになったのではないかと思う)

GC(ガーベッジコレクション)も画期的だった。
自分はリソースの管理をきっちり出来る(確保したメモリーを正しく解放できる)のが優れたプログラマーだと思っているが、やはり複雑なプログラムではリソースをちゃんと解放させるのは難しい。特にメモリーを確保してそれを関数の外に返す場合、どうすればきちんと解放できるのか、というのが…。
GCはそこを勝手にやってくれるので、プログラミングはすごく楽になった。

C++との兼ね合いで言うと、例外クラスが整備されたのも優れている。
C++のthrowは、整数でも何でもスローすることが出来たので、catchする側でそれに対応するのが大変だった。
Javaの例外は例外クラスで管理するデータが確立し、スタックトレースが出せるのもすごかった。

あと、リフレクションも驚きだった。
実行時にメソッド名を文字列で指定して呼び出せるなんてねぇ。
(よく考えたら、Lispでも実現されてた気はするけど^^;)

HTML

HTMLがプログラミング言語かと言うと議論があるようで、プログラミングっぽくは無いと思うけれど、言語ではあるよね?^^;

ウェブブラウザーが解釈して整形して画面に表示されるのに使われる。

表示されない属性もタグという形で一緒に管理するという文法は、分かりやすい。(閉じタグがくどいという話はあるが^^;)
ウェブブラウザーで表示される画面のソース(HTML)を見て、HTMLを勉強するということも昔はよくやった。

もっとも、今や人間が扱うのは他の記述方式に替わり、HTMLはプログラマーが直接書くのではなく生成されるのがほとんどかな。

ただ、自分は今でもHTMLエディターを使ってウェブページ作ってるよw
エディター上ではHTMLを意識せず書くけど、細かい調整はHTMLを直接いじる方が確実だったりする。

ホームページを提供するサービスはいくつもあったけど、けっこう閉鎖されて、インターネット上から過去の情報が消えたなんて話もあるみたいで…。
自分のウェブページは、インターネットプロバイダーにお金を払っている間は残るはずw

JavaScript

ウェブブラウザー上で動作するプログラムが書ける。

Javaを宣伝したいというマーケティングの都合でJavaScriptという名前になったみたいだけど、別物なので、今でもJavaとJavaScriptが混同されて混乱のもとになることがある^^;

ブラウザー上でJavaScriptを動かすとセキュリティーリスクがあると言われた時期があり、JavaScriptをオフにするのが推奨されていたこともあるくらいなんだけど。
GoogleがJavaScriptを駆使してGoogle MapやGmailといったサービスを作った衝撃で、JavaSciptは一気に復活した、と思っている。実際、ぐりぐり動くGoogle Mapは衝撃的だった!

最近はブラウザー上だけでなくサーバーサイドやローカルでもJavaScriptで動かせるようだけど、自分の知識は古いままだなぁ…。

TypeScript

TypeScriptはで読んだだけなんだけど。
JavaScriptに型を持ち込んだ言語。(コンパイルするとJavaScriptを生成する)

自分は型のあるプログラミング言語が好きなので、JavaScriptを扱う機会があったら、TypeScriptを使いたい。
(プログラムはデータを扱うもので、データには必ず型がある。プログラミング言語によってそれがプログラム上に明示されるかどうかの違いはあるが、自分はコンパイラーに型をチェックして欲しい派。特に大規模なプログラムでは)

Scala

JavaVMは優秀だけど、Java言語のプログラムは冗長なところが多いよね(近年はいろいろ改善してきてるけど)…ということで、JavaVMで動くclassファイルを生成するJava以外の言語というものが生まれた。
有名なところでGroovy、Kotlin、そしてScala
GroovyはGradleとして大変お世話になっております。
Kotlinは使ったことないんだけど、Androidでアプリケーションを作るのに使われているのだとか?(やっぱりキラーアプリがある言語はよく使われるよね)

Scalaは単純にJavaを便利にした構文もある(importの別名とか)けど、やはりオブジェクト指向プログラミングと関数プログラミングを融合させた点が大変素晴らしい。

Scalaの型はしっかりしていて、JavaだとList<String>とList<Integer>は関数の引数としてはどちらもListなのでオーバーロードできないんだけど、ScalaではSeq<String>とSeq<Int>は別物。

そういえば、JavaのintとIntegerがScalaではIntで統一されているのもいい。
それから、コレクションの統一感(継承関係)が良い。(ArrayとListがSeqを継承しているとか)

JavaでStream APIが導入されて便利になったけど、Scalaのコレクションの使いやすさにはやっぱり及ばないんだよねぇ。(JavaのStream APIは、なるほどJavaで導入するならこうなるかって感じで、特にFunctionalInterfaceとかcollectメソッドとかにすごく努力の跡が感じられるんだけど^^;)

Haskell

一度本格的に関数プログラミング言語を学んでおいた方がいいかと思って、ちょっとHaskellの勉強をしようかと思ったことがあったんだけど、関数呼び出しの引数が丸括弧で囲まれていないから関数呼び出しに見えず、即座に挫折しました。ごめんなさいorz
(C言語を学んで以来、一番長く使っている言語がJavaなので、脳がそういう関数呼び出し形式にすっかり染まってるんだよね…)

Python

Pythonの特徴は、インデントが決まっていること。

C言語やJavaだと、ブロックは波括弧で囲まれていればよく、しかしコーディング規約の方言によって、波括弧のどこで改行するかがまちまちだったりする…。

Pythonはインデントでブロックが決まるので、ソースコードの見た目も統一される。
インデントが強制されると不自由じゃないかなーと思ってたんだけど、実際コーディングしてみると、別に違和感は無かった。

少し気になった点は、PythonはJavaと同世代の言語の割にオブジェクト指向が中途半端な感じがする(長さを取得するのが関数なのかメソッドなのか統一されていない感じ)程度かなぁ。
あとはやはりコンパイルする言語じゃないので、例えばimort文が抜けてたら、Javaならコンパイルエラーになるんだけど、Pythonだと実行するまでエラーにならないのがちょっと…。

Javaのインターフェースに相当するものが無くて、特定のメソッドが定義されていたら特別な処理が出来るようになってる(ダックタイピング?)けど、その辺りはまさにプログラミング言語の考え方の違いだろうね。

Rust

Rustは所有権で有名な言語。

GC(ガーベッジコレクション)は無く、値が使用されなくなった時点でリソースを解放するのだが、それをコンパイル時点で判定する。
そのための概念が所有権で、これ自体はとても分かりやすいし超納得できる。
GCは実行に時間がかかることがあるし、リソースの解放がいつ行われるのか分からないという問題もある。所有権はこれを解決する。

しかし実際にRustでコーディングしてみると、所有権の考え方より「参照」で非常にハマった^^; 不変参照と可変参照の違いも甘く見ていた^^;
ChatGPTに質問したら意外と正しく答えてくれたのでなんとかプログラムできた感じ。AIが無かった時代にRustのプログラムを書いていた人たちは超すごいと思う。。

それから、C++やJavaのような例外機構が無い。Javaの例外はcatchブロックを作る必要があって、ブロックを作ると変数のスコープが影響を受けるので、コーディングしやすさを阻害する要因にもなる。
Rustは正常時の値とエラー時の値を返す構造体が用意されていて、それを扱いやすくする構文がある。

それから、あまり言及されることが無いように思うけれど、Rustは後発の言語なだけあって、エコシステムが大変素晴らしい。
最初のRustプロジェクト(ソースコードの雛形)作成もビルドも単体テストの実行もcargoコマンドひとつで出来る。
それどころか、依存ライブラリーの追加やソースコードの整形やドキュメンテーションコメントからのHTML生成まで全部cargoコマンドで出来る。
依存ライブラリーの公開方法(crates.io(JavaのMavenリポジトリー相当))も提供されているし、開発周りについて一通り揃っている感じだ。

cargo(≒rustコンパイラー)が対応している環境であれば(つまりWindowsでもLinuxでも)、同じコマンド・設定で実行バイナリーファイルが生成できる。
C言語から呼べる形式のファイル(WindowsのdllファイルやLinuxのsoファイル)も生成できるので、複数環境へ提供するプログラムを書くなら、C言語よりRustの方が便利だと思う。

というか、Rustって低水準なプログラミング言語のような気がする。高水準なプログラミング言語であるJavaなんかはプログラムは書きやすいけど環境ネイティブなバイナリーは生成できないし、目的次第だよね。

AIプロンプト

最近は、LLM(大規模言語モデル)(いわゆるAI)が発達してきて、自然な文章で質問して文章で回答を返してくれる。誤った答えを返すことがあるにせよ、これはこれで本当にすごい。
(MS-Excelのイルカ君、君は登場するのが早かったんや…)

LLMに指示してプログラムを生成することも出来るようになってきているらしい。まだ粗があるようだけど…。
もっとAIが発展すれば、確かにプログラム自体が不要になるかもしれないと思うよね。
例えば今でもClaudeは自然言語で質問すれば内部でselect文を生成してDBに問い合わせしてくれるから、こういうユーザーインターフェースが普及すれば、プログラマーがSQLを書く機会は減っていく(≒SQLが廃れる)だろう。HTMLを人が直接書く機会が減ったのと同じようなものかも。

そもそもSQLも自然言語(英語)に近い形で問い合わせたいという目的で決められた文法らしいし、その目的をLLMがようやく実現しつつあるということじゃないかな。

実際には、LLMは既存のプログラムを学習しているだろうから、既存の範囲内のもの(新しい組み合わせ)は生成できそうだが、世に公開されてないものやニッチなものは作れないような気がする。
(例えばLLMに「新しいDBMSを作って」と指示したとして、既存のDBMSより高性能で信頼性が高いDBMSのプログラムが生成できるか?)
まぁLLM以外のAIも研究されているだろうから、今後どうなるか分からないけど。

最後に

思ったより長文になってしまった^^;(書くのに4時間半くらいかかってるぞ…orz)

まぁ、プログラミング言語というものは、既存言語の欠点を改善するために新言語が生まれているわけで。そしていまだに究極のプログラミング言語が現れていないのは、何かしらのトレードオフがあるからだよね。

だから新しいプログラミング言語を使おうと思ったら、そのプログラミング言語の思想(何が改善されたのか)を勉強する必要があるっていうか、発想の転換をしてみる機会だと思うのがいいというか。郷に入っては郷に従えみたいな?

まぁそれでも思った通りのことが出来なくて「このくそ言語!」と思うこともあるけれど、上手く解決できたときに「なるほど、こりゃすげえ!」ってなれば嬉しいよねw


ちょっと話が逸れるけど、ゲームについて。
自分が子供の頃に8bitのゲーム機が出て、次に16bit機が出て、ポリゴンが出て3Dが綺麗になって…という流れを体感できたのはとても運が良かったと思っている。
今でも8bit時代のゲームをやることは出来るだろうけど、それが出た当時の熱狂は分からないよね。

プログラミング言語も同じで、プログラミング言語の進化を体験できる時代に生きているのは、とても運が良いことだとしみじみ思う。


Pythonの勉強をすることになりました

2018-01-08 20:13:11 | プログラミング

Pythonの勉強をすることになりました。
2017年末~2018年正月のほとんどはPythonに消えましたぞ^^;

最近機械学習というものが流行っておりまして、そのライブラリーを呼ぶのにPythonがけっこう使われているらしいんですな。で、Pythonを使っている機械学習の本をちょっと見てみたところ、なんとなくは分かるものの、やはり細かいところは理解できない。
というわけでPythonを勉強してみたわけですな。
その結果、理解できないと思った辺りはスライス記法だったらしいということが分かりましたw(これは確かにJavaScalaには無い)

Pythonは最近よく聞くようになったとはいえ、Javaと同世代の言語。
なので、オブジェクト指向と言う割にはメソッドと組み込み関数のどちらを使うのか整理されていなかったりする点は歴史的経緯から仕方ないんでしょうね^^;
しかしリストやタプルは操作しやすそうだし、変数に型が無い分、クラス関数関連の文法はかなりシンプル。
あと、内包表記というものが初めて理解できたw(Scalaのfor yield式が内包表記と呼ばれることがあったんだけど、どこが「内包」なのか分からなかった。Pythonのは括弧に囲まれているので、確かに内包されてるわw)

まぁ、Pythonの使い道が機械学習等のライブラリー呼び出しがメインということであれば、複雑なクラスを作ったりすることは無いだろうから、そういう人にとってはこれくらいの言語で良いのかも。


現場で役立つシステム設計の原則

2017-07-09 18:51:38 | プログラミング

現場で役立つシステム設計の原則』が話題になっていたので、(流し読み程度だけど)読んでみた。

基本的にはJavaがベースで、前半(というか最初の2章くらい)はコーディングレベルの話、残りはオブジェクト指向ベースの設計方法の話。

あ、ちなみに自分は最近はAsakusa Frameworkというバッチフレームワークを使う仕事が多いのでバッチ寄りの考え方で読んでいるけど、本書は基本的にウェブ寄り(Spring Framework)の思想っぽい。


コーディングレベルの話はとても納得。Javaでプログラミングする人は全員これを確認しておくべきという感じ。

(とても細かいレベルの事を言うと、if文の処理部分は波括弧で囲んだ方が(余計なバグが入る余地を減らせるので)いいと思う。ただ、書籍なので、行数を減らすために波括弧で囲んでいないのかもしれない)
(p.60でenumの列挙子が小文字なのはJavaの慣習からすると違和感がある。ただ、これもそういうコーディング規約だというなら、それでいいかも)

p.32の値を扱うための専用クラスを作る話とかは、理想はその通りだと思うんだよね~。java.timeなんかはそういう思想っぽいし。
ただ、Javaだとそのクラスを使った演算とか書くのが面倒なんだよねorz(c = a.plus(b)みたいな)
Scalaだと+等の記号を使った演算子が定義できるけど、実行速度はプリミティブ型よりは落ちる気がするし…。
(こういうのが得意なプログラミング言語はそろそろ有りそうな気はするけど、聞いた事は無いな…)

p.75の「データクラスが広く使われているのはなぜか」では、StrutsやJ2EEを真っ向からdisっていて、すげー!って感じ(笑)


後半からは設計に関する話になっていく。
クラス設計だけではなく、DBのテーブル設計や画面設計、Rest APIの話題まである。

ただ、この辺りから自分の常識とは違う内容が多くなってきて、戸惑う。
ただ単に自分の頭が固くなって受け入れられないだけなのか。別の人の評価を聞いてみたいところ。

p.137の「用語集が育っていく」という話は超同意。
初めて入るプロジェクトでは、まず用語集を確認するし。(と言っても、用語集が作られているプロジェクトなんてほぼ皆無だけど(苦笑))
そして、プロジェクトが進んで業務理解が深まってくると、用語もきちんと分かってきて、メソッド名とかクラス名とかシェル名を直したくなる(爆)
(余談だけど、AsakusaFWでは、処理(フロー)の為のメソッドをvocabulary(語彙)と呼ぶ。これは業務用語を意味し、「フロー上は業務用語を使って処理を記述する」という思想の表れだと思う)

6章のデータベースの設計は、一番戸惑いが多い。
本来なら、理解できない所ほどちゃんと読むべきなんだけど、流し読みしかしてないせいか^^;

p.183の取り消しデータの作成って、履歴系のテーブルならそうかもしれないけど、マスター系もそれだと、最新の情報を取得するのが面倒になるのでは? プライマリキーにも履歴項目が増えそうだし。

p.184のカラムの追加はテーブルの追加でって、恐ろしいな^^;
パフォーマンスの悪影響は大きそうだし、そのテーブルを使うアプリケーションの修正もカラム追加より大きくなるのでは?
虚データを入れないようにするという事自体はとても正しいと思う。本来は追加したカラムに移行データとして何らかの値を入れるべきで、ただ、そう出来ないケースの事を考えているのだと思うけど。追加したカラムのnullチェックの代わりにテーブルの有無チェックが入るだけだろうから、全般的に利点があまり感じられないっす。
自分はDBのテーブルもオブジェクト指向のクラスと同様に「責務」があると思っていて、本来その責務の範疇のカラムなのに、値が無いかもしれないから別テーブルとする、というのは、どうかなーと思う。

p.186のUPDATEを使わずDELETE/INSERTにするというのも、最初はえーっ!と思ったけど。
DBMSによってはパフォーマンスが違うだろうし、DBMSによってはUPSERT(MERGE文)という構文があったりするし。
ただ、よく考えてみると、AsakusaFWだとDBアクセスはDELETE/INSERTが基本なんだよね。
というかバッチなので、テーブルから全対象データをバルクリード(SELECT)し、処理をメモリー(あるいはシンプルなファイル)上でまとめて行い、結果をバルクロード(DELETE/INSERT)する。
本書はたぶんウェブ想定なので、プライマリキー毎にDELETE/INSERTであって、AskusaFWの使い方とは違うだろうけど。

とかくDBアクセスはボトルネックになりやすいので、自分としては、どうしてもパフォーマンスのことが先に来てしまう^^;
パフォーマンスのことを気にしないなら、表面上はオブジェクト指向のクラスに載せて、いくらでも綺麗にコーディングできるんだよねぇ。(そしてN+1問題とか発生するorz)
(AsakusaFWを使うようになってからは、DBアクセスは最初と最後のバルク処理だけ済むので、とても楽になったw)

7章の画面(ウェブ)で印象的だったのは、p.215 HTMLのclass属性の値を決めるのがドメインオブジェクトだ、というところ。
画面を作る責務を担うオブジェクト、だったらHTMLの内容をいくら持っていても全く違和感ないんだけど、そういう事なのかな?

8章のアプリケーション連携では、Rest APIについても触れられていた。
Rest APIはあまり携わった事が無いんで何とも言えないんだけど、p.259の日付の話はダウトな気がする。
そもそもRest APIは人間が見るものではない(JSONだから見ようと思えば見られるけどさ)と思うので、日付は世界標準の形式で出力した方が良いのではないかと思う。
(人間が見られる形に変換するのは、Rest APIでデータを取得した側の責務では?)
少なくとも、年月日であればタイムゾーンは関係ないというのは、違うんじゃないかなぁ。(日本でしか使わないRest APIなら、それでいいのかもしれないけど)

9章の開発プロセス、p.276のソースを第一級のドキュメントとして活用する話は、下手すると物議を醸しそうですなぁw
(自分も『設計書は必要』ってブログを書いた事があるしな~w)
実際、顧客に見せる/同意を取る為のドキュメントを除けば、基本的にはソースとソースの説明書(ソースで表現しきれない部分を補う)があれば事足りる、というか、楽だよねぇ。
本書では打ち合わせでホワイトボードに書いた内容は写真で撮っておけばいいじゃんみたいな感じっぽいので(たぶん語弊有り^^;)、そういう面まで含めて考えているのかなぁ?
(ちなみに、今の自分の仕事ではホワイトボードの写真を見せられることが結構あるんだけど、写真だけで説明が無いと、その打ち合わせに出ていなかった人には伝わらない事の方が多いですよorz)

以上、なかなか刺激的な本なので、ぜひ他の人の感想を聞きたいw

 


SIは楽しいよ!(状況による)

2016-04-15 02:12:27 | プログラミング

今週バズった話題:富士通を退職した話「SIer が天職です」って人はどこにいるの?に関連してあるツイートを見かけたので、Asakusa Frameworkを使っている身としては反応せねばなるまいっ。
「AsakusaFWを使うSIは楽しいよ!」w(ステマ)


まぁ冗談は置くとして、自分が今勤めている会社はAsakusaFWを扱っている会社であってSIerではありませんが、自分がやっている仕事はお客さんのシステムのバッチをAsakusaFWで作ることなので、SIと言えると思います。

つい先日Asakusa on M3BPが出たので、今はその検証をやっています。バッチの種類によるけれども、実行時間がAsakusa on Sparkより2~10倍(平均3~4倍)くらい速くなったので、とても楽しいですw
AsakusaFWはアプリケーションのソースを変更せずにHadoopSpark・M3BP用の実行バイナリーを作れる点が素晴らしい。(データサイズに応じて実行環境を変えるという運用が簡単に出来る)
(ちなみに、書いたアプリケーションがソート順に依存していたり、想定外データ(マスターなのに同一キーで複数レコードあったりorz)があったりすると実行環境によって違いが出てきます。自分が作った部分からバグを発見するとへこみますねorz 他人のバグを見つけるのは楽しいんですが(爆))

ただ、こういうことが出来るのは、仕事内容(お客さん)次第だろうとは思います。


自分は、今の会社に転職する前は、典型的なSIerに勤めていました。 
SIerにも当然すごい人は居るんですが、あまり表に出てこないと思います。

例えば、自分がJavaを教わったと思っている人が3人いますが(その人達は、Struts1が出るか出ないかの頃にウェブフレームワークを作っていた)、たぶんTwitterとかはやっていないと思います。ある人は、自宅にPCを持っていないと言っていました。会社でさんざん触ってるから、家では触りたくないって^^;
あと、管理職でも尊敬できる人がいました。自分はリーダーとか向いてないので、ああいう人はすごいなぁと思います。でも堅い会社で堅い立場だと、自由に情報を発信したりはしないでしょうね。

そういう訳で、SIerが天職だという人がいても、外からそういう人を知る機会はあまり無さそうな気がします。

ちなみに自分はホームページとか書いていて今の会社の人の目に留まったので、転職したいなら、やはり人に存在を知ってもらえるようなことをした方が良いと思います。(自分のホームページは、転職目的で始めた訳ではないですが^^;)


SIer自体は、システムを作るのが本業ではない会社(プログラムを書けない人)の代わりにシステムを作る(プログラムを書く)仕事なので、その存在自体は至極自然のものだと思います。

が、日本では立場が強い方(お金を払う方)が立場の弱い方に無理難題を言う傾向があり、それがSIerの仕事をつらいものにしている気がします。まぁ、SIerに限った話ではないと思いますが…。

だから、発注者・受注者の関係であっても、お互いに尊重しあって仕事が出来るなら、楽しく(というか不必要に嫌な思いをせずに)仕事が出来ると思います。信頼関係大事。

ちなみに、SIer時代はNTTデータさんとよく仕事をさせていただきました。
NTTデータの人はやはり基本的にプログラムを書かない(あまり書かせてもらえない模様)ですが、顧客との折衝・仕様確定やスケジュール管理・受け入れ試験等はきちんとやっていた印象があります。(その為の資料作りは大変でしたけどね^^;)
一方、○○通は友人が(SI部門ではないけど)就職したので話を聞いたこともありますが(以下略)。社名は誰でも知っている大企業なだけに、新卒の人からすると魅力的に見えるんでしょうねぇ。
(個人的に、富士通は昔からあまり好きではないんですよねー。X68000のライバル、FM-TOWNS!w) 


蛇足ながら、今自分が勤めている会社は、PCは好きなOSでよい、ディスプレイも大きいのが2~3台、ノートPCも貸与、背広じゃなくていい、出勤時刻がほぼ自由、お昼ご飯の時間も自由(たいてい店が混んでる時間帯を避ける)、基本的に1日8時間だけど用事(勉強会とか)があるときに早退しても問題ない(申請とか不要)、疲れたら昼寝してもいい、ももクロのコンサートへ行く為に有休をとるのは当たり前(?)(注・僕のことではありません。なお、ゲームが発売されたときに有休をとるのは当たり前でしょうw)等、環境面でもとても働きやすいです。

という訳で、プログラムを書く仕事は、とても楽しいですよ!
(しかし、やはり一般的なSIerが楽しいとは言いづらい(苦笑)) 


プログラミングの勉強を始める前に覚えておくべきこと

2015-10-21 23:08:59 | プログラミング

昨日今日で話題になっていたこと。

3つ目が今回気になった話。
僕はウェブページでプログラミング関連のメモを公開している。「自分のメモ」ではあるのだけれど、一応公開していることもあり、情報を他の人にどう伝えるかということにも興味を持っている。そういう訳で、(文系かどうかはともかく)どこでつまづくか、という話は興味がある。

で、プログラミング言語を学ぶに当たり、最初に心構えみたいなものを説明しておくのがいいような気がした。


プログラミング言語というのは、誰かが作ったものであり、その製作者が決めたルールに従っている。
したがって、「なんでそうなっているんだ?」と思っても、製作者が決めたものだ、ということでひとまず従うしかない。
(また、コンピューターは融通が利かないので、コンピューター側のルールに従わないと上手く動いてくれない)
たいていはそういうルールになっている理由(や歴史的経緯)があるけれども、説明する側からしても、初心者にいきなり理由を説明するのは難しい。慣れてくれば分かってくることもあるので、最初はとにかくルールを覚えるしかないと思う。

でもこれってたぶん、プログラミング以外でも同じじゃないかな?
僕は武術とかは習ったことは無いけれども、理由は分からなくても「型」を学ぶところからスタートするんじゃないかと思うw

あと、業界独特の言い方ってものもあるので、聞いたことがない言葉であっても、いちいち引っかかってないで、ひとまずそういうものだと思って受け流すのがいいんじゃないかな。
「Hello, World」とか「おまじないと思って」とかの言い回しも、プログラミング業界用語だ(笑)


(2015/10/26追記)

この「おまじないと思って」は、「必要だけれどもその理由を初心者に説明しづらいから、説明を保留する」というニュアンス。
(必要なければ、そもそも初心者に書かかせたりしない)
だから、最初は言われるままにとりあえず書いておけばいいけれども、仕事でプログラムを書くなら、それまでに必要な理由は理解しないといけないと思う。
(C言語でプログラミングするのに#includeを理解してないとか、あり得ないから!) 

ちなみに、良い入門書は、そういう必要な事項が順番に学べるようまとまっている。ネットで手に入る情報は断片的な事が多い(ピンポイントで何かトラブルを解決したいときはネットの方が便利かもしれない)ので、やはり勉強するときは入門書を読むのがいいと思う。
で、なるべくなら、入門書は2冊以上読むのがいい。1冊だけだと内容が偏っている可能性があるから。