歩いたら休め

なんでこんな模様をしているのですか?

【Python】ジェネレーターをn個ずつに分割する実装

「巨大なテキストファイルをジェネレーターとして読み込み、100万行ごとに分割し、別々のファイルに保存する」という処理を書いてました。

数百行ごとに分けるのならリストにして分割するのですが、今回は分ける単位が1000万行ごとなので一度にメモリに載せたくありません。遅延評価を保ったまま、以下のようにファイルを分けるコードを書こうと考えていました。

要するにnumpy.array_splitの入力値も出力もgenerator版です。

numpy.array_split — NumPy v1.14 Manual

from pathlib import Path

path = Path("/tmp/example/")

# tableは巨大なテキストファイルを一行ずつ読み込んだgenerator

for i, rows in enumerate(split_generator(table, 1000000)):
    filepath = path / f"output{i}.txt"
    with filepath.open("w") as f:
        for row in rows:
            f.write(row)

しばらく悩んでいたのですが、一応、以下のようにitertoolsを駆使して実装することができました。

from itertools import islice, chain

def split_generator(iterator, n):
    while True:
        each = islice(iterator, n)
        first = next(each, None)
        if first is None:
            break
        yield chain([first], each)

ただ、ジェネレーターが先頭から評価されなかった場合にどうなるのかとか、そもそも本当に1行ずつメモリに載ってんのとか、ちゃんと見ていかないと安心して使えなさそうなコードになってしまいました。もっと安心して使えそうな実装を思いついた(知ってる)方はコメントください。

「この問題についての正しい回答はおそらくPythonではなく適切なデータ処理基盤を使うことだ」と思っているのですが、今回はデータ元が特殊(記事ではテキストファイルとしてしまいましたが)だったのでそれも難しいです。

エンジニアリングって難しいですね。

【メモ】「買ってよかったもの」と「Strikingly」を使い始めてみました。

知り合いが薦めていた「買ってよかったもの」ってサービスを使い始めました。

katteyokatta.morishin.me

morishin.hatenablog.com

「毎回ブログを書くのもダルい」「でもツイートするだけは流れちゃうのでアレ」と感じてたのでちょうどいいサービスだと感じました。

あと自分のブログ横に表示するパーツがあれば個人的には嬉しいです。もしやったら一気にアフィリエイトサイトっぽくなっちゃいますがw

また、ポートフォリオサイト的なのも欲しかったのでStrikinglyってサービスを無料プランで使ってみています。

www.strikingly.com

自前でHTML書くのはメンテが面倒で放置しそうだし、かといってJekyllやPelicanで生成するのはオーバースペックだし、って悩んでいたのでこれもちょうどいいです。こちらはイラストレーターの方が使ってました。今後、作ったものはこっちにまとめていこうと思います。

http://takeshi0406.strikingly.com/takeshi0406.strikingly.com

【本】新年になってからいろいろ読んだ本

読んだ本をまとめつつ、アフィリエイトで小銭を稼ぐための記事です。もちろん書籍代のほうがかかるので赤字ですがw

集中力はいらない

西尾泰和さんが話されていた本。

scrapbox.io

私自身は「(著者の性格だと)1つの作業は途中で飽きるので、複数の仕事をConcurrentにこなしたほうが楽」「一つのことに集中しすぎると偶然必要な要素が手に入る、セレンディピティが無いので、いくつか関心のある物事を持ち続けてるほうがいいアイデアが見つかるよ」って意味合いだと理解しました。落合陽一さんが「百姓になろう」って言ってたのと似た感じ。

自分自身の生存戦略を考える際には、時間スケールが数時間~1日なら「集中」を、数日~数年なら分散(自分のテーマを元にいろいろ手を出す)を中心に考えたほうがいいかも。(急に生存どうこうってどういうことって思われた方、WEBエンジニアは生存戦略って言葉が好きなんです!)

Effective Java

全体的にいい本で、Javaプログラマーでなくても参考になります。

個人的にはHaskellの例外について調べていた時に見つけた例外安全性のスライドでExceptional C++とともに勧められていて、そちらはまだ私には難しかったので読みました。「例外を起こしたときにオブジェクトや変な状態にしたり、変な参照を残すな」、そのために「実際に使う前に、先にオブジェクトの状態をチェックして例外を投げる」とか「例外が起きた場合にロールバックする」ということまでは理解しました。

並列・並行処理の章はちゃんと読めてませんが、必要ないときに読んでもピンとこないので、きちんと取り組む必要が出てきたら読もうと思います。

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

ナリワイをつくる

Kindle Unlimitedでタダで読めましたw

エンジニアリング組織論への招待

最近やけに話題になってますね。エンジニアリングの仕事を「不確実性を下げる行為」と言っているのはスタンド能力っぽくてかっこいい分かりやすいし、ある本質をついていると思います。

あとハンロンの剃刀として「相手が嫌なことをしてきても、無能で説明が付く場合は悪意を見出してはならない」って身も蓋もないこと書いてたのも印象に残ってます。西海岸のハッカー文化など、エンジニアの文化的な話も多いので、そういうの興味ある人にもいいかもしれません。

恋する文化人類学

この記事が素晴らしかったので、著者の本も読んでみました。

文化人類学の入門書としても個人的な異文化交流の事例としても読めるようにした」ものらしいです。

現地の引き出物や結婚式の変わった風習に面食らいつつも、いちいち冷静に立ち止まって「これは親族の基本構造で言われた~」とか「贈与論の~」とか冷静な目で分析を始めるのでかっこいいです。ただ、資料収集時の癖が出てしまい、奥さんに「あなたの撮った結婚式の写真は誰が来てたのかわかりづらいよ」って言われてしまったというエピソードは職業病っぽくて笑ってしまいましたw

恋する文化人類学者

恋する文化人類学者

西太平洋の遠洋航海者

『恋する文化人類学者』で勧められてた本の一冊です。こういう本もKindleで売ってるのでいい時代ですね。

西太平洋の遠洋航海者 (講談社学術文庫)

西太平洋の遠洋航海者 (講談社学術文庫)

ガベージコレクションアルゴリズムと実装

社内チャットでJavaのstop the worldの話が出ていて、「Pythonだとどうなんだろう」と興味持っていたときにちょうどブックオフで見かけたので買いました。でもちゃんと理解してません😢

私が普段使っているのPythonでは、参照カウントがメインで、循環参照の処理に他のGCを使い分けている。そのため「(stop the worldのように)GC実行中にアプリケーションが完全に止まる」ってことは考えにくいが、循環参照のGC実行中はその可能性があるかもね。もしあったらgcモジュール試してねってある意味当たり前のことが書いてました。

また、そもそもGCアルゴリズムはおおまかに分けて3種類あるらしい。他のアルゴリズムもだいたい得意分野の組み合わせで考えられるそうです。

  • 参照カウント
  • マーク・アンド・スイープ
  • コピーGC

世代別GCみたいに言われているものは、これらのアルゴリズムにプラスαで工夫する感じみたいです。だいたいこの3種類の特性と、世代別GCみたいなよくある工夫まで知っていれば最初のひとまず自分の疑問には答えられそうです。

ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装

超AI時代の生存戦略

なかなかいい本で、「進化した機械学習やグローバルな競争には勝てないから、自分ならどうやってコモディティ化したものに対して+αできるかを考えればいい」「競争自体を避けよ」みたいな主張です。

あと「ローカルなコミュニティで1位になるところを作り、それをグローバルな文脈に持っていく→またローカルで…」みたいなサイクルで勉強できるといいよね、みたいな話もありました。

超AI時代の生存戦略 ―― シンギュラリティ<2040年代>に備える34のリスト

超AI時代の生存戦略 ―― シンギュラリティ<2040年代>に備える34のリスト

お金2.0

けっこう話題になってたので読みました。「誰もが自分の都合のいい経済圏や思想を選び、分断された社会が来る」って話はポスト真実社会的な話は面白いです。

細かい話ですが、「ベーシックインカム(BI)があればお金がボトルネックにならなくなる」という主張があり、そもそも「なぜBIが導入されるのか」「そもそもBIを導入するインセンティブあるのってそもそも誰なの?」って根拠が書かれてなかったのがちょっと残念でした。そこだけでもけっこう面白い話できそうですし。

お金2.0 新しい経済のルールと生き方 (NewsPicks Book)

お金2.0 新しい経済のルールと生き方 (NewsPicks Book)

増補改訂版Java言語で学ぶデザインパターン入門

「そういえば今までちゃんとデザインパターン勉強したことないな」と思って読みました。

いい本だとは思いますが、やっぱりこういうものって必要あって産まれてきた概念だと思うので、何もない時期に勉強するのはモチベーション上がりませんでした。でも後々リファレンス的に使うかもしれません。

Haskell等だと数学の概念を援用するけど、Javaだと工場とか人の喩えを使うのが文化の違いっぽくて面白いです。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

僕たちのインターネット史

ゆるい本です。「西海岸っぽい考え方に影響された人は技術に夢見がちで大仰な警告出したがるけど、山形浩生さん(伽藍とバザールとか、ローレンス・レッシグのCODEとかを翻訳した人)はいい感じに東海岸(現実的)っぽくてバランス取れてていいよね」って書いてたのを覚えてます。あと、日本のインターネットって、2ちゃんねるニコニコ動画で「思想は無くても盛り上がればいいや」カウンターカルチャーっぽさが薄まってるよねって話とか。

「WEB時代になって(サイトが公開されている一方、裏側のコードはクローズドだから)オープンソースの考え方って薄まったよね」って書いてたけど、ここにはちょっと疑問があった。有名な企業はだいたいオープンソースにもコミットしているので、変容はしてるけど薄まってはいないと思う。って話を先輩としたら、「OSS自体でマネタイズしようとした企業はほとんどいなくなったよね(Mozillaみたいなもの?)」って話をされました。

あと伺か(with 任意)の話とかありました。えんいー。

僕たちのインターネット史

僕たちのインターネット史

プロカウンセラーの共感の技術

これもKindle Unlimitedでタダで読めました。いい時代です。

以前読んだ『医療とコミュニケーション』という本では合理的な議論では良いのですが、「共感」という視点は欠けていたと思います。その場合、こちらの本が参考になるかもしれません。

kiito.hatenablog.com

プロカウンセラーの共感の技術

プロカウンセラーの共感の技術

時間の言語学

時間は抽象なので、私たちが時間を認識するとき、なにかに「見立て」るしかない。この「見立て」つまりメタファーを分析することで、“時間”を具体的に意識化することができる。近代において最も強固な「見立て」は〈時は金なり〉のメタファー。コーパスや、具体的なテキスト(「吾輩は猫である」「モモ」等)を探り、私たちが縛られているさまざまな時間のメタファーを明らかにした上で、新しい時間概念(「時間は命」)を模索したい。

近代になってから「Time is money」のメタファーで「時間は浪費するもの」「管理するもの」ってイメージが出来たって話が面白かったです。

人はなぜ物語を求めるのか

この本を読んでたら「筆者は人生に期待するのを止めたら生きるのがラクになった」って書いててブッダかと思いました。「一切皆苦」って言葉の「苦」は、苦しみだけじゃなくて思い通りにいかないこと全般を表しているそうです。

人は真実を手に取ることができない。ましてやその手触りを他者と共有することは不可能である。そこで、思考の枠組みとして導入されるのが「物語」だ。そう、本書の指す「物語」はしばしば「演劇」や「小説」ではなく、事実の羅列に因果関係を見いだそうとする人間の思考癖についてである。

こういうのって、例えばデータ分析のとき、分析者が意識してないとまずいことかもしれませんね。

Hit Refresh(ヒット リフレッシュ) マイクロソフト再興とテクノロジーの未来

最近、マイクロソフトのプロダクトがイケてる(例えばVS Code等)のは、この人のおかげなのかもしれません。

Hit Refresh(ヒット リフレッシュ) マイクロソフト再興とテクノロジーの未来

Hit Refresh(ヒット リフレッシュ) マイクロソフト再興とテクノロジーの未来

SM調教師瞳 と同人ハードの夜明け

同人誌です。スーパーファミコンをハックして任天堂非公認のゲームを作る(作った人へのインタビュー)内容です。芸能活動する前の桃井はるこのバイト先の話もあって、技術以外でもかなり濃い内容でした。

ソーシャルメディアと公共性

kiito.hatenablog.com

こっちに書きました。

【本】『ソーシャルメディアと公共性』感想まとめ

最近読んだ『ソーシャルメディアと公共性』という本が面白かったのですが、インターネット上で誰もブログ等を書いておらず、悲しかったのでおすすめする記事です。

大震災・原発事故やテロリズムなど様々な社会的リスクへの対応が求められる今日,一方でSNSなどのソーシャルメディアが日常のリアリティを変えつつある.世界秩序を揺るがす脱真実の時代がくるのか,新たな公共性と社会関係資本の構築は可能か.第一線の研究者たちが課題に挑む.

ソーシャルメディアと公共性 - 東京大学出版会

学習院大学の教員紹介ページに編者の遠藤薫さんの紹介がありました。本全体を通してこの問題意識で議論されています。

現代、メディアが急激に発展しています。メディアは、コミュニケーションを媒介し、世界を認識する基盤となります。メディアの変化は世界を変えます。

TwitterFacebook、LINE、instagramといった新しいメディアを皆さんも日常的に使っていることでしょう。

1990年代から広く使われるようになったソーシャルメディアは、誰でも自由に発言し、膨大な情報にアクセスできることから、表現の自由を最大限に保証し、少数者の意見にも耳を傾ける、民主主義のプラットフォームになると期待されました。

マンガやアニメ、観光などの日本文化も、ソーシャルメディアを媒介にして世界への発信力を高めています。

しかし、ソーシャルメディアが普及するにつれ、副作用も目立つようになっています。

一部の過激な発言が、ネガティブな感情と共に、増殖・感染し、あたかも多くの人に共有される意見であるかのように拡散します。それが政治や選挙にも影響し、偏狭なナショナリズムや他者に対する不寛容が秩序を揺るがしています。テロや国際対立を助長しているケースさえあります。

問題が山積するなか、メディアの発達はさらに続きます。ロボットや人工知能が、私たちの日常に組込まれつつあります。社会はこれからどのように変化していくのでしょう? 私たちはメディアをうまく使いこなすことができるのでしょうか?

WEB企業のプログラマーである私も、「ITやソーシャルメディアが無ければ知り合えなかった友達ができたことがある」一方で「検索サイトやFacebookフェイクニュースが多いけど大丈夫なのか」、「自分自身も技術・科学のニュースで情報をどうやって取捨選択すればいいか分からない」「一昔前より裏付けをしっかり探さなきゃいけなくなった」と感じているのですが、「post-truth」というキーワードで議論されていて興味深かったです。

また、『偶然の科学』でワッツが書いていたような、SNSのコミュニティ分析もあり、個人的にネットワーク科学を勉強していた時期があったので懐かしくなりました。

「細かいコミュニティに分断されていて、そこをつなぐ橋は作れるのか」という話は、落合陽一さんの本に書いていたような「ローカルなコミュニティで自分らしさを発揮せよ」「そこからグローバルに持っていってもいい」みたいな話を思い出しました。あと『分断』というキーワードはポール・グレアムのエッセイで始めて見たのですが、ちゃんとした社会科学の文脈で話されていたのを見たのは始めてです。

【プログラミング】私がGo言語を使わない唯一の理由

マスコットキャラクターのGopherくんを見るとチェコのロックバンドHentai CorporationのPVを思い出すからです。森で襲われる…。

www.youtube.com

こちらのアルバムに収録されています。

Tsocsssaaagtmwhvahhh

Tsocsssaaagtmwhvahhh

  • アーティスト: Hentai Corporation
  • 出版社/メーカー: Bandzone Records (digi distributed by Prodejhudbu.cz)
  • 発売日: 2013/12/23
  • メディア: MP3 ダウンロード
  • この商品を含むブログを見る

あと、Octo Gatoというバンドの猫ロゴも既視感あって最高ですw ステッカー欲しいですね。

f:id:takeshi0406:20171230125322j:plain

www.youtube.com

関連記事(?)

mt.orz.at

【Game Boy Advent Calendar】PythonプログラマーがGBでチップチューンを始めて変わったこと・驚いたこと

これはGame Boy Advent Calendar 2017の15日目の記事です。遅くなってしまいすみません。

クラウド環境(AWS)やスクリプト言語Python)を使うWEBプログラマーが、ゲームボーイというレトロな環境に触れて驚いたこと」をまとめた記事です。

私は仕事で、PythonRubyを主に使って、AWS/GCP上でのシステム開発やちょっとしたデータ分析を行っています。また、『抽象度の高いプログラミング』をするために、クラス設計や(使いこなしているとは言えませんが)Haskell等の関数型言語も勉強しています。

本当は、ファミコン(正確にはNES)でのチップチューンで有名なchibi-tech先生に「矩形波で人間の声を再現して歌わせる方法」について質問することができ、GBでどの程度再現できるのか実験しようと考えていたのですが、正直時間が足りずにできませんでした。機会があったらまとめておきます。

「なぜGBでチップチューンを始めようと思ったのか」については、以前書いた記事を読んでください。一言で説明すると「TORIENAさんの曲にいい感じにノイズ乗っててかっこよかったから」です。

sakana38.hatenablog.com

メルカリやヤフオクに抵抗が無くなった

私は大量生産・大量消費の経済社会に産まれ、Amazonで技術書を買って暮らしています。そのため、メル×リやヤフ×クなどは下賤の者が使うものだと思いこんでました。

ところが実機でチップチューンを始めるとすると、『ゲームボーイというハードを(中古で)買う』ほうが予算が抑えられる場合があります。特に、ハードがジャンク品として売られていることが多く、その場合には複数台のまとめ売りを買ってリスクを抑えるのは有効な戦略です。

メルカリも使ってみると意外に便利なのと、「案外値段が適当に決められていること」「届いてみるまで実際の状態は分からないこと」「『〇〇さん専売』みたいなオレオレルールを導入してくる奴がいること」などバザール的なやりとりが面白く、ちょっとしたギャンブル感もあって燃えます。 私は「裏に名前が書かれているカセット」を引き、「多分カーチャンが独立した息子のゲームボーイを処分したのだろう」と分かってエモい気持ちになりました。

一部のレトロゲーマーは「大量出品されたジャンクハードを買って修理すること自体が趣味になってしまう」「どこも壊れてないと逆に萎える」と聞きましたが、それも納得です。

私も「せっかくだから音楽の評価が高いファミコンゲームもやっておくか」と思ってファミコン7台セットを購入してしまいました。そして友達に「Motherめっちゃ面白いよ!」って話をしたら、「懐かしい!GBAの再録版でやったよ!」って話をされてジェネレーションギャップを感じました。

マザー

マザー

改造やはんだ付けに抵抗が無くなった

AWSというクラウド上開発することが多いので、ハードを見ることはほとんどありません。一度、インフラチームの先輩に連れられてデータセンターでブレードサーバの中身を交換しに行った程度です。

そのため、「既存のハードに手を加える」ことには抵抗があったのですが、実際の初代ゲームボーイにはバックライトが無く、時間帯によってはメルカリで買った時に付いてきたメトロイド2をプレイするLSDjで曲を作るのにも少し苦労しますし、暗いライブ会場で演奏することもできません。

これに対処するため、昨年のGame Boy Advent Calendar 2016のch3cooh393さんの記事などを参考にして改造しました。その過程で海外通販(Hand-Held Legend)を使ったことも新しい経験です。

blog.ch3cooh.jp

ただ、今から始める人には、GBA SPを勧めると思います。それは、デフォルトの状態でも音が太く、画面もカラーでバックライトも付いており、メモリも豊富で処理落ちしづらい(らしい)ので、すぐに音楽に集中できるでしょう。

手続き型プログラミングへの抵抗が無くなった

多くのPython言語のプログラマーは、Haskell等の抽象的な言語を学び、標準ライブラリのitertoolsをいかに美しく使えるかを競っています。さらにもう少しHaskellに慣れると、中二病で「副作用(I/O等)使用罪」「変数の破壊的変更は悪」などのHaskell共和国のお題目を唱え始めるようになります。

ただ、LSDjで表現したいものはI/O(=音を鳴らす)が本質的な世界です。実際LSDjに限らず、トラッカーソフトは「音符を配置したサブルーチンを並べる」し音色の操作にgoto文のようなコマンドを使うこともあります。

そもそも、ゲームボーイはメモリ資源が少ないハードなので、「サブルーチンを分けすぎるとスタック領域を使ってメモリの効率が悪い」「ガベージコレクションはメモリを使いすぎる」「クロック周波数を意識して命令数を抑える必要がある」など、Linuxサーバー上では意識しないレイヤーの話が出てきます。後から会社の先輩に聞いたのですが、現代でも組み込み領域だと割と意識されてることだそうです。

ファミコンの驚くべき発想力 ?限界を突破する技術に学べ? (PCポケットカルチャー)

ファミコンの驚くべき発想力 ?限界を突破する技術に学べ? (PCポケットカルチャー)

後から知ったのですが、そもそも関数型言語の最右翼であるHaskellでもIO a型を使う必要があり「可能な限り参照等価な関数とI/Oを伴う手続き型的な処理を分けよう(do記法で手続き型っぽく書くこともできます)」と主張しているだけだし、高速化のためにST s型として破壊的操作のできる配列などの変数を使うこともできます。

つまり、私が不勉強だっただけで、実際には「自分が表現したいものに適切な言語を選ぶことが大切」だということに気が付きました。

もっと低レイヤーの知識が身についたら、「処理落ちしやすいLSDjのコマンドを調べて、内部的な挙動を推測する(例えばサブルーチン呼び出しでメモリを食ってるんじゃないかとか)」みたいなことができたら面白そうです。

hyksln.jugem.jp

OSや高級言語への感謝が産まれる

LSDjを使っていると、すぐにセーブデータが壊れることに気づきます。特に「音楽を再生しっぱなしにして電源を落とすとぶっ壊れる」仕様のせいで、LSDjをいじっている間に寝落ちしてセーブデータが壊れ、悲しい気持ちになります。

そんなときに、Linux等のOSへの感謝が産まれるのでおすすめです。また、ハードごとの命令の違いをAPIとして抽象化して吸収してくれるとかヤバすぎます。

オペレーティングシステム (未来へつなぐ デジタルシリーズ 25)

オペレーティングシステム (未来へつなぐ デジタルシリーズ 25)

公式ドキュメント < 実地の経験

私は先輩からは「問題が起こったらまずは公式ドキュメントに立ち返れ」と教わっています。Qiita等の記事を見ても、同じように教わっている人が多く、プログラミングや開発では正しいと思います。

qiita.com

ただし、音楽になると話は別だと思います。もちろんLSDjの公式ドキュメントを見てコマンドの説明を読むことは大事ですが、「どのように使えばカッコイイ音になるのか」などは別に学ぶ必要があります。そして、それは上手くいってないです…。

それは元々「ゲームハードやホビーPCをハッキングして、本来とは違う使い方(音楽)をする」というコミュニティの発祥まで繋がるのかもしれません。

英語への抵抗が無くな…ってないw

Square Sounds Tokyo 2017というチップチューンにイベントを見てきて、お客さんの半分強が海外の方だったのでビックリしました。

誘ってもらったのですが、私は英語が苦手なので全然会話できない…と思ってたら、日本人の偉い(偉いって表現はアレかもしれないけど)人もかなりブロークンな英語(Your performance was cool!みたいな感じ)で喋ってて「あ、これでいいんだ」って思いました。ただ、持って生まれた性格がシャイなのでそもそも初対面での会話は苦手ですw

英語とは関係ありませんが、Chip Tanakaこと田中宏和さんの曲がすごい異世界でやばかったのを覚えています。

Django

Django

Q. ふ〜ん、で、チップチューンは作れるようになったの?

うるせえ!

やっぱり音楽自体が難しいのと、どのように作り始めたらいいか分からない→どうしても自分にとって分かりやすいファミコンとか技術とかに逃げちゃうので作れるようになってはないです。

生活スタイルはだいぶ変わりました。具体的には、過去の技術者やミュージシャンへの感謝と敬意(こんな難しいことやってるなんてすげえ!)が産まれたことと、ゲームボーイファミコン、分解用のドライバーが散乱して部屋が汚くなりましたw

「私はこういう風に作れるようになったよ」って話があったら教えてください。

最後に、Game Boy Advent Calendar 2017も引き続きご注目ください。

【雑記】新人プログラマーになる妹へのアドバイス

妹からプログラマー職として就職するという連絡が来ました。この妹が実在するかどうかは皆様のご想像に任せます。

他の職も含めていろいろと悩んだそうなのですが、おそらく私の影響でこういう職種に親しみがあった(というか抵抗感が少なかったというほうが正確?)なのでしょう。ひとまず、おめでとうございます。

プログラミングの経験があるわけじゃなく、テクノロジーよりも、文化や歴史のほうが好きなタイプです。そのためいろいろ苦労すると思いますが、「この職種を選んで良かった」と言ってもらえるように(もしくは私のせいでひどい道を選んだと思われないようにw)、最初はいろいろ手引きを残しておこうと思います。

とは言っても、私の言いたいようなことは既に書籍やインターネットでいろいろな人が言い尽くしています。ひとまず@shyouheiさんの優秀なプログラマーになるためのコツあたりがオススメです。

「問題を解決すること」を忘れないで

これで終わるのも味気ないので、いくつか簡単なアドバイスをします。

プログラマーの仕事は「技術を使うこと」ではなく、「問題を解決すること」です。素晴らしい技術を使っても、きちんと使われて利益を生み出せないと意味がありません。

問題に向き合うことを忘れて、安直に「この××を導入すれば楽になるんだ!」「最近話題の超イケてるプログラミング言語を使おう」って飛びついてしまうと、大抵時間やお金を払って不便な思いをするだけです。それぞれの道具が、何を目的に作られたものなのかちゃんと見定めましょう。

逆に、ニュース通知などの単純なプログラムでも、問題を大きく外してなければ喜んでもらえます。そして、問題の解決は新しい問題を生む(エラー通知はどうしよう、コードのメンテナンスがつらい等)ので、「これってショボいんじゃないかな?」って思っている問題でも、それを問いていく過程で新しい発想や技術に触れられると思います。

ライト、ついてますか』という本にこういう例がよくまとまっていたので、一度読んでみてほしいです。

ライト、ついてますか―問題発見の人間学

ライト、ついてますか―問題発見の人間学

大事なのは「問題の本質を見つけること」「それに合った解決策を出せること」ですが、「これってどうやればうまくいくの?」を説明できるほどの実力はまだ私にはありません。ただ、シリコンバレー流の「早めにリリースして修正する」方針は参考になるかもしれません。

www.slideshare.net

ここまで大げさじゃなくても、関係する人に早めに見せると、自分の間違いが早く修正できて楽になります。

「楽をする方法」をまず考えてね

「勤勉なこと」はもちろん良いことですが、今の情報化社会では勉強しなければいけない分野が多すぎるので、真面目にやると疲れます。

例えばネットワークで問題が起こった時、いろいろな解決方法があると思います。

  • 自力で勉強して解決する
  • 先輩に泣きつく
  • (一旦)放置する
  • ...

この中から「自分やチームを総合的に見て、一番楽で時間のかからない方法を選ぶ」ゲームだと思うと良いです。上のような場合、「先輩に泣きついた後に、怒られながら勉強する」スタイルが一番効率が良かったですw

また、スクリプト言語Python, Ruby...)を一つ学ぶと、ボタンひとつで終わらせる定型作業が案外多いことに気づくと思います。余った時間はこっそりネットサーフィンしましょう。

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

ルールを守った上なら悪人になっていいよ

打ち合わせや交渉する場も少なからずあると思います。そういうときは、相手に気を遣うよりできるだけ自分の主張をハッキリとしたほうが、自分も相手も困らないことが多いです。というか、自分は気を遣ってるつもり(あの人時間なさそうだし…)でも、相手はそうじゃない(実は今は重要じゃない仕事ばかり)ってことが多いです。

残念ながら、自分のことを「私は悪いことしてないのに報われない」と思っているときほど、おそらく周囲からは迷惑な存在として思われています。

以前も紹介しているのですが、『医療とコミュニケーションについて』という本がこの点良かったです。

「『悪い人』は目的が決まっており、適切に対処すれば撤退してくれるからある意味付き合いやすい。『いい人』は目的がはっきりしないし、一方的に期待を積み上げてくるので交渉の余地がない」という話にも考えさせられました。

自分のことをクソ野郎だと思っていると、「こんなこと質問するとダメなヤツだと思われるんじゃないか」みたいな変な躊躇が無くなるのでオススメです。

レジデント初期研修用資料 医療とコミュニケーションについて

レジデント初期研修用資料 医療とコミュニケーションについて

また、『人を動かす 文庫版』も同じような文脈でいい本でした。あまり関係ないのですが、『7つの習慣』はやりがい搾取感が拭いきれず好きではないのですが、カーネギーとは友達になれそうな感じがします。

もちろん、違法なことをやれという意味ではないので、ルールとマナーは守ってくださいw あと度胸と愛嬌もあると尚良いです。

毎日勉強する習慣をつけるといいよ

数ヶ月経つと周囲が「毎日勉強する人(さらにアウトプットも出す人)」「全然勉強しない人」に2分されてることに気づくと思います。というわけで、「毎朝30分必ず本を読む」程度でいいので、インプットする習慣をつけると良いです。

私の同僚のエキスパートは「インプットするだけでは無駄。技術的にアウトプットも含めないと勉強にならない」と言っており、彼の言うことも正しいのですが、まあ気持ちが落ちてる時期もあるので無理なく続く程度にしてください。

snowlong.hatenablog.com

もちろん、「Write Code Every Day」と言って実践している方もいるので、もしかしたら参考になるかもしれません。

おそらく性格的に本を買いまくると思うので、早めに電子書籍リーダーを買うと良いです。私はiPad mini + Kindleアプリを使っていて、今のところ不便は感じてません。

iPad mini 16GB Wi-Fiモデル ホワイト&シルバー MD531J/A

iPad mini 16GB Wi-Fiモデル ホワイト&シルバー MD531J/A

スキルを言語化する努力をしよう

上手く言えないのですが、特にプログラミング言語は技術を説明するための言葉で、適切な概念を知っていれば驚くほど簡単に問題が解けることがあります。また、(今は縁遠いと思うかもしれませんが)数学も似たような性質のものです。

同僚のコードレビューで「こういう書き方するのはなぜですか?こうした方が楽じゃないですか?」と訊かれることが多く、その度に自分の暗黙知をきちんと言語化して(もしくは私のほうが間違っていて)意識的に使いこなせるようになることもあります。

…やっぱり上手く説明できないです。このあたりの本をおすすめします。

一人称研究のすすめ: 知能研究の新しい潮流

一人称研究のすすめ: 知能研究の新しい潮流

メンターを見つけよう

いろいろ書籍や記事はあるのですが、悩みや強み弱みは人それぞれで、自分の問題からは少しずつハズレていることも多いので効率は良くないです。

例えば、この記事でも「問題をちゃんと定義する」みたいな面を強調しがちですが、会社に入った後で「私が悩んでるのはそこじゃなかったわ」「セクハラ係長うざい」って思ってしまってるかもしれません。

こんなとき信頼できる先輩を見つけられると、もう少し客観的で的確なアドバイスを貰えると思います。

運動しよう

座りっぱなしだと正直気が参ってくるので、適度に身体を動かしましょう。これは私もできてないので、良いスポーツの趣味が見つかったら教えてくださいw