カテゴリー 「開発メモ」 RSS

2024-05-02

[] ダブルチェック

開発者が書いたコード要件通りの動きをするか確認するときは、開発者以外の手によってテストされたほうが良い

なぜなら開発者にはバイアスがかかっており「これで正しく動いているはずだ」という観点を持っていて、テスト観点に移すのが難しいためである

開発者の粗を探すつもりで挑む別の立場人間を用意してテストさせるべき

2024-05-01

[] It doesn't work...why?

ソースコードに間違いが見つからないのに想定される出力をしない。あるいはソースコード修正を加えていないのにいきなり想定出力を返すようになった。」

こういう経験がある人はいるはずだ。なぜこれが起こるのか。一つの原因を見つけた。

それは環境変数設定ファイル存在する。デプロイ時には設定ファイル特定の値に修正してから、ということがあるだろう。

開発環境コーディングする人が、デプロイ時の設定ファイルには関与せず、デプロイ担当者がそれを把握している。

開発者セキュリティ上の理由デプロイ時の設定ファイルの内容を見ることができない。

この場合設定ファイルの内容が間違っていても、開発者が原因が正しく特定できないケースがあるのである

対処方法は以下である。まず事前にやっているであろう対処は以下である

事前にやっていない可能性がある対処は以下である

 

追記:

他に遭遇したケースは、環境アップグレードによってphp特定関数廃止したというケースだ。

インフラ要員がアップグレードを行うので開発者は原因がわからなくなる。

2024-04-28

[] 暗黙の集計

プロットライブラリデータフレームライブラリデータベース、などが集計関数を用意している。

例えばある場所ではプロットライブラリの集計を使っているが、別の場所ではデータベースで集計してからプロットするということがあるだろう。

そうするとどういうわけか計算が合わなくなるのである

ライブラリが内部でどういう処理をしているかブラックボックスであるため、これは問題である

ライブラリの集計関数を使う場合テスト用のデータを用意しておき、集計値が一致するかを確認するのがまず必要

次に集計方法バラバラでなく揃える必要がある。プロットライブラリに集計させるより、データフレームに集計させてそれをプロットしたほうが良い。

またデータフレームにおいても、groupbyとpivot_tableで集計の扱いに差があったりする。

これらの差が生じる一つの理由はNullやdatetimeに対する処理の違いだったりする。

暗黙の集計に対応するのは大変なので、テストデータに対する集計が正しいバリエーションを選び、その方法で全部揃えたほうが良い。

2024-04-25

[] DBでuniqueやnot nullをちゃんと考えろボケ

例えばDBデータをpandasに一式読み込むとする。

そのときにnot nullである必要のある項目がそうなっていないと、なにかの手違いでnullが挿入され、データ型に依存した処理などでエラーが出たりする。

またuniqueにするべき項目でそうなっていない場合も、手違いで重複を許して混乱の元である

DBスキーマ設計するときちゃん考慮してね。

2024-04-14

[] 開発プロセスについての情報鵜呑みにするな

アジャイルがどうの、ドメイン駆動開発がどうの、マイクロサービスがどうのと、開発プロセスについての情報が巷にあふれている。

しか勘違いしないほうがいい。あなた現場にとって最適な方法を追求できるのは、あなた現場人間だけだ。

外の世界の「これがうまく行った」論は、文脈無視しては話にならない。企業Aの文脈企業Bの文脈が全く別のものであるなら、開発プロセス成功法則再現性がないのである

「開発でこういうことが困っている」ということがあれば、それを列挙するところから始めるべきだ。現場人間は「問題」がはっきりすれば解決策を考え出すだろう。

モジュール独立性について困っている」という話をしているときに、「マイクロサービスとして独立させよう」という情報がググって出てきたら疑ったほうがいい。

2024-04-10

[] 自分のやることだけやってりゃいい

他社の製品等と比較して、明らかにUI/UXが劣っている。そういう経験はあるだろう。

しかあなたバックエンドプログラマーであり、UXデザイナーではない。

そういうときは、「まあ、給料をもらってるし、それを改善するように言っても俺の給料は上がらないし」と言って諦めよう。

酷いUX/UI放置し続けた人たちは、それが良いものだと信じている。

デザイン素人と思われているあなたが「ダサいです」と言ったら、トラブルを生むだけである

2024-03-21

[] プロプライエタリAPI無料でも使うな

無料APIサービスとして公開しているとして、それに依存するコードを書いたとする

しか企業の都合であとから有料になることが考えられる

例えば翻訳API無料で公開していたとして、あとから有料になるということだ

有料になってコストがかかると、そのAPIへの依存度が高ければ高いほど、ビジネスとしての損失につながる

その損失がAPIを使う利益を上回るのである

プロプライエタリAPI依存しそうになったときは、それを自前で実装できないかまず考えろ

例えば事前訓練済みモデルであればhuggingfaceが使える場合があるだろう

損益利益を大幅に上回る場合に、huggingfaceでモデルが見つからなかったり、代替策がない場合は、関係各位に相談し「機械翻訳を使うことをやめる」ことを検討したほうが良い

 

追記: jparacrawlは商用利用が不可らしい

2024-03-19

[] 実装必要情報が揃うまでは関係各位と調整しろ

実装を進めて、あとの方で「やっぱこうして」といって後戻りの工程が発生すると穴を掘って埋めるような感覚になる。

こういうのは効率性を低下させるので、関係各位と調整して情報を揃えたほうがいい。

もし情報限定的しか揃わない場合は、非常に簡易的なプロトタイプを触ってもらって、「こうしたほうがいい」という声をもらう。

情報として基本的なのはUI設計データ設計だろう。これらが煮詰まった段階でデータフローシーケンス特定していく。

例えばUI担当者が外観の設計を渋っているときは、入出力だけでも特定し、その入出力のプロトタイプを作っておいたほうが良い。

単純なものであれば、REST API化して試してもらえるだろう。

2024-03-17

[] 分析ドメイン専門家やらせ

分析ツールを作って、様々な凝った統計情報を表示したいと思ったことはないだろうか。

ロジスティック回帰モデリングして係数表示をしたり、決定木を視覚化したり、相関の行列ヒートマップで表示したりと、いろいろなことができる。

しかしいざツールを作ってみると、「そんな分析必要ない」と叱責されてしまうのである。これは一体どういうことなのか。

それは開発に近い人の考える「分析」とビジネスに近いところにいる人の「分析」が、メンタルモデルからし全然違うのである

ドメインに近いところにいる人たちは、もっと基本的統計要求するだろう。

収益の推移だったり、アイテム特定属性ユーザークリックされる確率だったり、特定の条件に合致するアイテムの単価の分布だったりと、そういうものだ。

こういった分析ほとんどはExcelで行われる。

開発者がやるべきことは、csvファイルアイテムに対する特定検索条件・グルーピング条件などで出力してダウンロードさせることだ。

ドメイン担当者検索条件を入力してcsvダウンロードし、分析Excelで行うだろう。

2024-03-15

[] 巨大な問題は分割する

開発者AとBがいる。

開発者A「ビジネスモデル全体を最適化するための施策実施中です」

開発者B「アイテムの重複を避けるために、アイテム属性文字列から固有の識別子を生成しています

一見すると開発者Aのほうが全体を俯瞰していてデキそうに見える。開発者Bが無能アスペのようだ。

しかし開発の進捗を確認すると、Aは全く進んでおらず、Bは「重複を排除するロジック完了したので、これを効率的に実行できるようにしています」と言っている。

ご察しの通り、問題を細かく分解していかないと、開発というのは進まない。

全体を俯瞰してビジネスについて考えているふりをするだけではコードという形にはならないのである

開発者Bは穴を掘り進めなければならないので、実際に掘っている。開発者Aは穴を掘る必要があるかどうかすらわかっていない。

別の言い方をすれば、巨大に見える問題も、適切に分解すればグイグイと進んでいくとも言える。開発者Aのように巨大なままで捉えていると、何も実装できない。

2024-03-12

[] 開発環境の違いによるコーディングスタイルの不統一

Vimを使っている開発者が、pythonコードのインデントをスペース2として書いていた

他の開発者はpep8に従っているのでインデントはスペース4である

Emacsでは、tabを押せば即座にスペース4として補完されるのでタイプ数が増えるということはない

ところがこのVim利用者はスペースを2連打して入力していたようである

コーディングスタイルは、原則としてグローバルスタンダードとなっているもの採用した方が良い

pythonであればpep8を使えば、他のコードとの整合性もとれる

もし他の開発者が「スペース2のほうが生産性が高い」というなら、tab一回の入力で補完されるような環境設定を推奨すべきである

スペース4というのは、ちゃんとした理由もある

まりコードブロックを視認するためには4ぐらいの幅があったほうが見やすいということだ

頑なな開発者がいるなら、デプロイ時点でautopep8を自動適用してしまってもいいかもしれない

とにかく、コーディングスタイルバラバラなのは問題である

共通コーディングスタイルとなるように、開発環境の設定を共有するべきだろう

2024-03-08

[] コストの低い工程試行錯誤すること

工程には段階がある。

アイデア要件定義設計実装テスト運用

という流れがあるなら、「アイデア」の段階での試行錯誤が一番コストが低い。

運用」の段階で「やっぱりこのサービスは儲からいからやめよう」となると、それまでかけたコストが水の泡になる。

まり前の工程ほど、試行錯誤をするコストが低いと言っていい。

一方、「サンクコストバイアス」には十分注意するべきだろう。

アイデア」の段階で、誰かが特定アイデアお気に入りアイデアとして採用し、それを深めて議論していたとする。

そうして、別の誰かがさまざまな検証を行った末に、そのアイデア成功する確率が低いと分かったとしよう。

そのときお気に入りアイデアを手放さない人がたまにいる。

アイデアの段階の良さは、試行錯誤コストの低さであるため、ダメだと分かったアイデアはすぐに捨てるようなつもりで挑んだ方が良い。

そうでなければ、ダラダラと運用までたどり着いてしまい、何にも儲からないサービス運用することになるだろう。

運用までたどり着くと、サンクコストバイアスはより強固になり、コストしかならないサービスを意地で運用しようとしがちである

2024-03-04

[] クラウドサービス利用時はベンダーロックインに注意せよ

ベンダーロックインとは、特定ベンダー製品を使うことにより、その仕様合致した周辺環境コードを設定してしまい、移行が困難になるような現象

最近、BigQueryを使うことによってこのベンダーロックインにぶち当たった

「使うにはコスト制限があるから、やっぱ自鯖にしよう」となったわけである

BigQuery特有機能を別の環境に移行するには大幅な変更が必要になる

その工数についてはいうまでもないだろう

ベンダーロックインの臭いを嗅ぎ取ったら早めに判断し、避けた方が良い

もし後から「やっぱこれ使いたくない」と言ってすでに依存状態にあるシステムから移行しなければならない場合は、

残念ながら簡単な移行方法は存在しないと言っていい

BigQueryであれば何らかのNoSQLを使うか、スキーマを無理やり抽出してmysql等に変換する方法もあるだろう

そのようなことを自動的に行う有料のサービス存在するかもしれないが、新たなベンダーロックインとならないよう、注意深く仕様を見た方が良い

2024-02-26

[] 最小の労力で実施する

コード修正する、システムに変更点を追加する、など色々なことを開発者実施している。

ここで重要なのは、最も少ない労力で実施する方法を探すことだ。

例えばコード修正する場合、100行を追加するよりも、1行だけ追加して実現できないかを探る。

あるいはシステムについても、専用のコード作成するよりも前に、*nix系コマンドの組み合わせでできないかを探る。

最小の労力で実施するために、すこし時間をかけて考えた方が良い。

「最小労力」という基準採用すると、保守性を上げることができる。

これを意識すれば、頻繁にリファクタリング実施せずに済む。

2024-02-25

[] 全部を書き直す必要はない

コードエントロピー機能追加によって増大する傾向にある。

「この関数にこういうパラメータを使ったこういう処理を追加してくれ」などと言われたら、コードは複雑化するのは当然だろう。

かといってこういう要求が来た時に、コード全体を一から作り直して簡潔にしようと思うのはナンセンスだ。

コードの量にもよるが、一定程度の量のコードがそこにあるときは、やはりリファクタリングの方が効率よく進められる。

「僕はリファクタリングなんてしませぇん、一から書いた方がいいでぇす」というのは、特定現場・状況だけにあてはまるものだと認識しておこう。

かにコード全体をリファクタリング」なんてしようと思ったら大変すぎるが、通常は「修正担当する部分をついでにリファクタリングする」でOKだ。

ユニットテストさえかけていれば、そのリファクタリングによって、バグが見つかりやすくなるだろうし、保守性も上がるのである

なお、本当にコードベースが酷いカオス状態で、ゴッドオブジェクトを使っているような状況になったら、「書き直す」という利点が少しはあるかもしれないが、そういう場合関係各位に同意を取らなければやってはいけない。

そういったカオスな状況でさえ、平均的なプログラマーは「良いコード」よりも「慣れているコード」に愛着を持つ傾向にある。

もしあなたが「コードを綺麗にするためにすべてを一から書き直そう」と、無断でそのようなことをやったら、彼らが慣れていないという理由批判の嵐が殺到するだろう。

もう一度言うが、最善の方法修正担当部分だけをついでにリファクタリングすることだ。これだけにとどめておけ。

2024-02-19

[] モジュール

コードを簡潔に保つにはモジュール化が必須であるしかし同じモジュール関係のない機能が含まれていたりすると混乱の元になる。

モジュール内の関数機能的関連性は凝集度という。

一方で、関数というのは引数の細かな仕様依存せずに、汎用的に呼び出せた方が何かと好都合だ。引数になんらかのオブジェクトを渡し、そのオブジェクトしか持ち得ないような特殊情報で処理を行なったりすると、関数オブジェクトが互いに依存しあってしまう。

これはモジュールの結合度と呼ぶ。

高い凝集度、低い結合度によってモジュールを作れば、保守性は上がる。

さらモジュール内では、公開する必要のない関数はprotectedまたはprivateにするべきだ。

そのためにはモジュールが公開すべき関数についてインターフェイスを作り、公開関数に対するユニットテストを書いておくのが良いだろう。

2024-02-04

[] 警告を潰す

Elasticsearchを使っていて、ふと気がついたのは、無意味warningがあまりにも多すぎるということだ。

コードベースにElasticsearchを使う部分が増えるに従って警告の量がどんどん増えていく。

しかもその警告は対処する必要さえない不要ノイズなのである

エラーであればその原因特定のためにトレースを表示するべきだろう。

しか無意味ノイズとしての警告は、それが増えるに従って、コード上の何が問題なのかわかりにくくなってしまうのである

こういう無意味な警告はすべて表示しないように潰した方が良い。

2024-01-31

[]メイン関数の書き方

メイン関数では主要な処理をざっと実行する。このときに、以下を気をつけると保守性が高くなる。

こうすると、自然言語を読むような形でコードを読めるようになり、技術的詳細は隠蔽するので、担当者をわかりやすく分離することができる。

2024-01-29

[] 速度とシンプルさにトレードオフがあるという神話

pythonコードの速度のボトルネックを見つけるにはline_profilerが使える。

ゲーム感覚ボトルネック特定し、段階的に改善する。

だが一部の開発者は「速度に凝り過ぎるとコードが読みづらい」という。

これには異論がある。

大幅に速度を改善するようなコード改善は、むしろコードシンプルに保つ上でも重要な働きがある。

傾向としては、マルチプロセッシングなどを使わずに速度を改善した場合は、プログラムの長さは減少する。

速度を改善すれば、特定の出力をするコードの最小長(コルモゴロフ複雑性)に近づく。

速度改善によってわかりにくくなるという人は、数学ができないのかもしれない。

物理学では、変数単一文字で表すことが多いが、こういうのに慣れていると「シンプル」の概念に差が開く。

こういった科学的な「シンプルさ」を理解できない人に対して、意味説明する形で変数名を決めても、結局コード理解できないだろう。

かにビジネスドメインに近いコードであれば変数名をドメイン語に合わせるのがわかりやすい。

しかし「ボトルネック改善しなければシステム要件通りの速度にならない」ようなケースでは、数学的なコードの方がわかりやすくなるのである

2024-01-26

[] データの受け渡し

特定インデックス管理する技術者(Aさん)がいるとしよう。

このインデックスサイト全体の検索で使われるため、CTRを気にするなら最も重要なパーツだ。

ここで私が検索アルゴリズム改善するための特徴量をインデックスフィールドに挿入したいというとする。

しかし特徴量を管理するのが私であるのに対し、インデックス管理するのがAさんであるので、どうやってこの受け渡しをするのかという問題が生じる。

私がインデックスマッピングルールを書き換えるわけにはいかないのである

そこでバッチ計算してそれぞれのアイテムIDに対する特徴量をDBプレーンテキストに保存しておくようにする。

すると

バッチ計算 → 保存データ → Aさん → インデックス

という流れが生まれる。

Aさんは保存データを参照してインデックスに挿入すれば足りるようになる。

このようにして、システムを書き換える権限がない場合データを受け渡すというパターンによって対処できる場合が多い。

2024-01-22

[] phpコードベースを綺麗に保つ

php場合、<?php 処理 という具合に書くが、この中身にはhtmljavascript包含することができてしま

MVCフレームワークを使わないにしろ基本的にビューとバックエンド処理は分割しておくべき。

さらDB処理、ビジネスロジックプログラム処理と言ったものがあるが、

DB処理はdbhandler専用のモジュールに分けておき、さらにそのモジュールを処理するテーブルごとに分けておいた方が良い(MVCではモデルと言う)

特にビジネスロジックプログラム処理の区別だが、「商品名アダルト商品と思わしき文字列があった場合登録拒否する」という例外は「ビジネス例外であるのに対し、「商品名文字列DBで用意されたvarcharの可変文字範囲を超えた」という例外は「技術例外であるということを明確に区別するようにコードを書く。

おすすめ機能」のような凝ったアルゴリズム必要場合はそれ専用のクラスへ分離しておくこと。

あと外部化可能な設定情報jsonで分離するようにしておいた方が良い。

ログイン ユーザー登録
ようこそ ゲスト さん