とくにソフトウェアとかインターネット的な世界のはなし。典型的な用法は「〜〜という新しい技術を仕事で使いたいのだけど、上司が許可してくれない」というものだ。この〜〜には、たとえばちょっと前だとLAMP, Ruby on RailsとかAWSとかHadoopだし、今だとなんだろう、DockerとかC#かな。うーんこの違和感。私の定義では、これはどれも技術ではない。ただのソフトウェアだ。AWSはサービスだ。
TCP/IPやSIPは技術だろうか?わたしの感覚ではノーだ。ただの仕様だ。いずれもベースになっている技術はあって、たとえばパケットのルーティングや名前解決、フレーム再送やウィンドウ制御の仕組みや実装は技術といっていいだろう。Hadoopは分散処理の技術を実装したソフトウェアだ。LAMPはWebサービスを実装するためのソフトウェアスタックの総称で、そのなかに様々な要素技術はあるだろう。Dockerの中で使われいているAufsや依存性管理の仕組み、名前空間などを使ってインスタンスを分離する仕組み自体は技術だが、「Dockerという技術を習得する」という日本語は間違っている。
もうちょっと展開してみよう。Git引いてはGithubをソースコード管理などのツールとして導入したときに、「Githubという技術を導入した」とは言わない。「Gitという技術を導入した」これもおかしい。「レポジトリを分散して管理できる技術を実装したGitというソフトウェアを使って、分散レポジトリを活かした開発フローを導入した」これくらい言わないと技術という言葉は使えない。課題を解決する体系立てられたワザを技術というのであって、ソフトウェアやサービスそのものを技術とはいわない。
わたしの感覚だと、片仮名でテクニックといわれる種類のものの方が技術と呼びやすい。たとえば探索系の問題があったときに単に深さ優先にするのではなくて、DPで実装する。数値計算ならdoubleとfloatで使い分けるコツが違うし、できればSIMD使いたいけどちゃんと実装するのは難しい…(SIMDをちゃんと実装した数値計算のライブラリがあったとして、それは単にライブラリであって技術とは呼ばない)。たとえばMySQLのbinlogレプリケーションはSplit brainが起きるけどSQL ServerならPaxosを使っているのでそれが起きない、とかそういうの。
よく「○○を支える技術」といって、その会社なりサービスを支えるソフトウェアスタックや、その運用を紹介する本が出版されよく買われるようだ。その本は、単に採用されているソフトウェアなりサービスのリストが書かれているわけではない。大抵はそこにある課題と、それを解決する方法が書かれていて、その方法のひとつの実装としてソフトウェアなりサービスの名前が載っているわけである。
もうちょっと違う説明の仕方にしようか。たとえば自分たちのECサイトにリアルタイム推薦を導入したい。そのときにリアルタイムレコメンドができるJubatusを導入するとしよう。Jubatusは新しい技術か?わたしの定義ではそうじゃない。Jubatusはソフトウェアだ。そこに実装されているLSHや、それを複数ノード間で同期する仕組みは技術だ。別にJubatusじゃなくてもSolrでもなんでもよい。Solrそのものはソフトウェアだ。その中で実装されているTokenizerや転置インデックス、インデックス更新の仕組み(詳しく知らない)は技術だ。やりたいことを実現する手段なり工夫なりを技術というのであって、ソフトウェアやプロトコルのことを技術とは呼ばない。
これが私の定義なのだが、Wikipediaなどを見ると「そもそも多様である」的なことが書いてあるの。インターネットでちょっと私の定義の合わない用法があったとしてもまあ言葉狩りだと思われたくもないので、まあ喧しく言わないようにしてここに書いて忘れることにする。
ちなみに、件の上司は、「○○という(仕事の)課題は、△△という技術で解決できるのですが、それを実装したものは〜〜というソフトウェアしかないので、〜〜を使うしかないです」といえば説得できると思う。それであなたが使いたいものは何でも仕事で使えるようになるよ。