初めまして。入社してようやく1年経ったかな…というASです。
現場企業の社内で使われるツールの開発、メンテナンスに従事していますが、それに伴って仕様を纏めたり、設計書未満のドキュメントを作ることもあります。
その際に気になるのが、条件記載時の単語の使い方です。
「〇〇の時、△△を行う」
条件式は、プログラムを書く際に必ずといっていいほど出てくるものです。ですが、その条件の書き方・解釈のしかたを間違うと、大変なことになります。
条件式で最も重要なことはしきい値、つまり「処理をする・しないの分岐点」の表現方法です。
様々なケースがあると思いますが、幾つか実体験を交えつつ書いていきたいと思います。
【section 1】以上⇔以下、未満⇔???
「A<=10」「A>=10」
それぞれ日本語で書けば「Aが10以下」「Aが10以上」ですね。「以下」と「以上」は対になる二字熟語です。条件式で大小を問うことは、もはや基本中の基本でしょう。
では「A<10」「A>10」は、日本語でどう書きますか?
1つ目は簡単ですね。「Aが10未満」。2つ目は「Aが10より大きい」と書く人が多いのではないでしょうか。(ちなみに1つ目を「Aが10より小さい」と表記しても正解です)
――じゃあ「未満」と対になる二字熟語は、なに?
答えは「超過」です。「Aが10を超過」などと表現します。
あまり普段耳にしない単語かもしれませんね。
でも「レンタルDVDを返し忘れて超過料金を取られた」なんて言ったり、「無料分のデータ量を超過して課金が必要になった」なんて風に使うことはありませんか? そんな風に使うこともある「超過」が「未満」の対義語です。
なお「超過」の対義語を辞書で調べると「不足」という語も出てきます。あくまで「未満を基準としてみた場合の対義語が超過」となります。(対義語は一対一じゃないところが、日本語の複雑なところですね…)
【section 2】「から」「まで」把握していますか?①
では「超過」という単語を覚えたところで実例に移りましょう。
英語のbetween。「~の間」を意味するこの単語は between A and B などとして、SQLの構文で使う場合があります。
もちろんSQL以外にも使う言語はあるでしょうが、一番分かり易そうなのでSQLをサンプルにします。
user_idを整数値とした時、次の①~③は全て同じ条件を意味しています。
①WHERE user_id BETWEEN 100 AND 200
②WHERE user_id >=100 AND user_id <=200
③WHERE user_id >99 AND user_id <201
まあ③はあまり使わないですね。大体は①か②でしょう。
個人的には=の書き忘れをしないためにも BETWEEN を使う方が良いんじゃないかな~と思いますが、そこは他の条件式との兼ね合いもあるので、一旦は「そういう風に書ける」で留めておくことにします。
さて。この「WHERE user_id BETWEENN 100 AND 200」を日本語で書くと「user_idが100と200の間」「user_idが100以上200以下」「user_id が100から200まで」等となります。
「から」「まで」は、どちらも対象となる値を含みます。「100から200まで」は100も200も対象です。
今回サンプルとしては挙げませんでしたが、比較的、日付の話をする時に「~から~まで」を使うように思います。
(例:3/31までに提出して下さい=3/31中に出せばセーフ)
もしも200を含むけれど100は含まない・・・式で言えば「WHERE user_id >100 AND user_id <=200」の時は、「100以上200以下」と書いてはいけません。「100より大きく、200以下」(または「100を超過、かつ200以下」)と記すべきです。
でも、これを「100以上」と書いてしまう人が少なからずいます。
大声では言えませんが、以前、コードに
1 2 |
//targetが60以下の時 if (target < 60){ |
なんて書いているものがあって「ええええどっちが正しいの!?」となった時があります。
(で、仕様を確認すると、コードが間違っているときもあって「まじか…」となることも……。わ、笑えない……)
逆にプログラムでは正しく表現できていても、コメントや仕様書で表現を間違えてしまっては、正しい仕様が伝わらなくなってしまいますね。十分に注意が必要です。
【section 3】「から」「まで」把握していますか?②
つい最近(今更~? と言われそうですが)TreasureDataに触れる機会がありました。
ある一定範囲の日付データを取得したい…という時、「TD_TIME_RANGEという関数を使う」と教わりました。
1 2 3 4 5 6 7 8 |
boolean TD_TIME_RANGE( int/long unix_timestamp, #1. 主に time カラム int/long/string start_time, #2. 開始時間の時間文字列 int/long/string end_time #3. 終了時間の時間文字列 [, string default_timezone = 'UTC'] #4. Timezone ) ・start_time の値を含みますが,end_time の時間は含みません。数学的に [ start_time, end_time ) 。 ・Timezone はオプションですが,日本時間における範囲を指定するには 'JST' を必ず記述します。 |
このTD_TIME_RANGEの指定が「start_timeは含むけれど、end_timeは含まない」というものでした。つまり 「start_time <= targetRange < end_time」ですね。
もし2019年3月1日から3月10日までのデータが欲しい場合、start_timeに2019年3月1日、そしてend_timeに2019年3月11日を設定します。これで「3月10日のデータまで」を得ることができます。
このように関数を見ただけでは伝わらない仕様を、きちんと説明文を読んで理解しなければいけません。
・・・正直「終了時間」って書かれているだけだと、その値を含みそうに見えるんですけどね・・・含まないそうなんですよコレ・・・。
同じことが、私たちが書く(であろう)プログラムや設計書にも言えるでしょう。
「終点を含まない」が、その開発チーム(もしくはプロジェクト)の共通言語なら問題ないと思います。ですが「この処理は含むけど、こっちは除外」のように、ふわふわ揺れていると、うっかりミスを誘発しやすくなります。
【section 4】英語の「以上」「以下」は?
開発言語やライブラリ類の説明書きは英文なことも多いので、条件にまつわる書き方は覚えておいて損はないと思います。
最近は翻訳ソフトも優秀なので、違和感ない文章に訳してくれますが、コード部分など「そこは訳さなくていいのに!」という部分まで日本語化されたりして、結局原文を読むことに・・・なんて、実に「あるある」な話です。
ネイティブではないので、あくまで「辞書で調べた範囲」の話になりますが、section 1で書いた以上・以下・未満・超過は下記の様に表現されます。
〇〇以上=or more(and more)
〇〇以下=or less
〇〇より小さい(未満)=less than(under)
〇〇より大きい(超過)=more than
under XXXは分かり易いんじゃないでしょうか。映画やお酒、タバコの禁止文面でよく見ると思います。
ちなみに「~まで」を示すuntilはちょっと使い方がややこしいです。
「I’ll be away until Monday」
日本語に訳すと「月曜までいません」と書きたくなりますね。でもこれ、実は「日曜までいません(=月曜日はいます)」なのです。
・・・お前さっき、上の方で『「から」「まで」は、どちらも対象となる値を含みます 』って言ったじゃん!
いやこれホント混乱するんですが、そこが言語の差です。
untilは「特定の状況、活動が終わる時を示す」そうで、until 〇〇は、「〇〇な時が終わる時点を示す」のだそうです。
これを踏まえてもう一度。until Monday → Mondayには終わっている = 月曜日はいます
・・・・・・・ややこしいですね!!!
このように「until」が使われているときは、しっかりと前後の文章も含めて判断する必要があるでしょう。
(ちなみに、こういう場合は「I’ll be back on Monday」と書けば、月曜日に戻る=日曜までいません――となって、スッキリ勘違いの余地もなくなります)
【まとめ】
プログラマ間であれば「ツールや言語における暗黙の了解や、数式による表現」を、共通言語として持っていることができるでしょう。
ですが対クライアント・対エンドユーザでは、それを認識できていないことがあります。もしくは使った言語によって違いが出てしまうこともあります。
小さな勘違い、小さな齟齬が、大きなバグを産むことがあります。コードを書く時は勿論ですが、要件・仕様を定義する際も、この辺の配慮は常に持っておいた方が安全だと思われます。
表記ゆれやあいまいな表現を極力なくすように、言葉の選び方には気を付けたいですね。