プロトタイピングの生産性

Rubyの学習と技術調査を兼ねて、イントラネット内の端末からWEBプロキシを通ってSSLで接続する中継サーバを介してテキストを交換するプログラムを作成してみました。
異常系を考えないでだいたいの動作が確認できるものが一日程度の作業でできてしまいました。
慣れた人であれば全く当然のことのように思われるかもしれませんが、今まではPerlPythonなども詳しくは知らなかった私にとってみれば、リファレンスマニュアルやインターネットを調べつつ試行錯誤しながらでもこれだけの時間でできてしまったことは驚きでした。
振り返って自分の作業がはかどった理由を考えてみると、ライブラリの充実やコードの記述性そして自分との相性(覚えやすい)などもありますが、やはり対話的に実行しながら確認できるirbの活用が大きかったと思います。
もし既に知識や経験のある内容のプログラムであれば言語や開発環境にかかわらずそれほど生産性に差は出ないと思うのですが、知識が十分でなかったり調査しながらの試行錯誤が伴う場合には静的型言語よりも動的型言語の方が効果的だし、irbの様な対話的に実行できる環境を活用することで効率的に作業が進められると思います。
プロトタイピングは調査が目的であり、目的外の部分はとにかく手っ取り早く多少強引な方法でもプログラマの直感でコントロールできる言語が重要だと思います。
このような点からPerlPythonRubyなどはライブラリなども十分に豊富だしあとはプログラマとの相性で使いこなせば効果的だと思います。


参考までに今回作成したプログラムを引用しておきます。
SSL接続しテキスト情報を行単位で中継するサーバ:sslRelayServer.rb

require 'socket'
require 'openssl'

include OpenSSL

ctx = SSL::SSLContext.new()
ctx.cert = X509::Certificate.new(File.read('cert.pem'))
ctx.key = PKey::RSA.new(File.read('servernopass.key'))
svr = TCPServer.new(443) # port
serv = SSL::SSLServer.new(svr, ctx)

waiter = {} # waiting peer table

def relay(from,to)
  Thread.start(from,to) do |from,to|
    from.each do |line|
      print(to, ":" + line)
      to.write line
    end
    print(from, " is gone\n")
    from.close
    print(from, " is to be close\n")
    to.close
  end
end

while true
  Thread.start(serv.accept) do |s|
    print(s, " is accepted\n")
    connectionID = s.readline
    print("id:" + connectionID)
    waiting = waiter.delete(connectionID)
    if waiting == nil then
      waiter.store(connectionID,s)
    else
      print(waiting, " and ")
      print(s, " is connecting!\n")
      relay waiting, s
      relay s, waiting
    end
  end
end

WEBプロキシを経由して中継サーバにSSL接続するクライアント:sslClient.rb

require 'socket'
require 'openssl'
include OpenSSL

useProxy = true

if useProxy then
  soc = TCPSocket.new('localhost', 3128) # Proxy server address and port
  soc.puts 'CONNECT localhost:443 HTTP/1.0' # SSL Relay server address and port
  soc.puts ''
  print soc.readline
else
  soc = TCPSocket.new('localhost', 443) # SSL Relay server address and port
end

ssl = SSL::SSLSocket.new(soc)
ssl.connect
ssl.puts 'This is connection ID.'

Thread.start(ssl) do |s|
  s.each do |line|
    print line
  end
end

while gets
  ssl.write $_
end

ssl.close
soc.close

WEBプロキシを介さない場合にはこれ(sslClient.rb)の代わりにOpenSSLを使用することができます。

openssl s_client -connect localhost:443