カテゴリー
仕事効率化 個人開発

プログラミングを効率化する方法

社内SEとして働いていると、プログラミングする機会が多くあります。プログラム本数も結構多く、プログラミング言語も一つだけじゃなく、VB.NET、Oracle、Access VBA 、ExcelVBA, VB6, COBOL, C# など様々です。

特に Oracle SQL と MSSQL の違いにはうんざりします。SUBSTR が使えなかったり、NVL が使えなかったり。全く同じSQLにしといてよ!って思います。

この記事では、プログラム本数が多かったり、様々なプログラミング言語を扱う時の効率化の方法を紹介します。

1. コードスニペットを作成する

コードスニペットとは、コードの断片のことです。そのままではビルドできませんが、ある特定の機能を実現するコードの断片をコードスニペットといいます。

コードスニペットがあると、一からコードを書く必要がなくなります。コピペするだけで実装したい機能のコーディングが完了します。

2. ラッパークラスライブラリを作成する

ラッパークラスとは、実現したい一連の機能をまとめて実装するクラスのことです。例えば、「ファイルを新規作成して開く」という機能を実装する場合、ファイルを開くまでの一連の機能をクラスにしてしまうのです。

こうすることで、コード量が削減でき、かつテスト対象のコードステップも削減できる可能性があります。

3. プログラミング言語を選ぶ

プログラミング言語はそれぞれ目的をもって生まれたものが多いです。例えば深層学習や機械学習を実装する場合、ライブラリを多く持っているのはpython です。ExcelやAccess DB を扱う場合、VB.NET や C# よりは、VBA を採用した方が効率よく開発することができるかもしれません。SAM ファイルを扱う場合は、COPY 句の概念が使えるCOBOLがいいでしょう。

このように、システムの機能要件や特徴によって、扱うプログラミング言語を変えると、開発効率が向上します。

4. ボイラープレートを使う

プログラミングでいうところんlボイラープレートとは、プログラミング言語の仕様上ほとんど変わることのない部分のことを指します。

HTMLのボイラープレートが一般的ですが、<html> <meta> <style> <script> など、一般的なHTMLファイルであれば必ず似たような記述になるソースコードをボイラープレートとして予め記載しておきます。ソースファイルを新しく作るタイミングで、ボイラープレートをコピーすることで、本当に必要な機能のコーディングに集中できるようになるのです。

カテゴリー
ライフ 仕事効率化

【社内SEのすすめ】ベンダーSEより社内SEの方がメリットが多い理由

私は自動車部品製造業の社内SEとして5年近く働いています。投資総額2,000万円を超えるシステムの要件定義から携わったり、中国やメキシコの出張も経験しました。

社内SEになる前はベンダー系のSEでしたが、社内SEの方がメリットが多いです。

この記事では社内SEのメリットについて書いてみたいと思います。

1. システム利用者の生の声が聞ける

社内SEの1番のメリットは、利用者の要望を直接聞けることです。ベンダー系SEであればユーザー企業の情報システム部門担当者とのやりとりになりますが、社内SEは利用者から直接要望をヒアリングします。

システム開発にあまり携わった経験が少ない人の意見ですので、突拍子のないことを言われたりもしますが、本当に必要な機能を要望してくれます。

今まで聞いて感じたことは、Excel VBA の要望が多いことです。まだまだExcelは現役です。殆どのユーザーはExcelでデータ入力を行います。そのデータをインプットにして、Excelをアウトプットする場合はVBAが一番簡単で早く実装できます。

2. 内製開発ができる

これは情報システム部門の方針に依るところが大きいですが、内製開発を行うこともあります。上述したようにExcel VBA 案件もあれば、ウェブシステムの案件もあります。

設計からプログラミング、運用保守まで、自分で経験できるのは、大きなスキルアップになります。

3. 外注できる

システム要件が複雑で難易度の高いものであったり、納期までの期間が短い場合、ITベンダー企業へ外注することもできます。というより、外注している企業が多いかもしれません。

外注範囲も自由に決めることができますので、要件定義からお願いすることも有れば、プログラミング〜結合試験までをお願いすることもあります。

外注範囲をしっかり考え、納期と品質と費用を最大限にすれば、自分に対する評価も上がるでしょう。

4. ある程度、納期をコントロールできる

ベンダーSEであれば、お客様からの希望納期を可能な限り守る必要があるでしょう。これが原因で長時間残業やデスマーチがおこります。

社内SEの場合、お客様は社内にいる利用部門です。社内調整ですので、納期調整がかなりやりやすいでしょう。

どうしても調整できない場合は、外注するか、リリース範囲を縮小させるなどを検討する必要があります。自分への負荷が増加しないよう、周りをうまく使いましょう。

5. 経営課題に対して、先端のIT技術・プロダクトをどう活用するか考えることができる

ディープラーニングをはじめとしたAI技術、ビッグデータ分析、RPA製品、働き方改革を実現するためのテレワーク系ソフトウェアなど、世界には本当に多くのIT技術やソフトウェアが存在します。

それぞれのIT技術・ソフトウェアは、解決したい課題をもって生まれたものですが、それらがそのまま自社へ適用できるわけではありません。

業務内容や課題を理解して、どの製品が一番マッチしているか、それらを組み合わせてシステム化し、利用者の作業負荷が軽減される。システムエンジニアの醍醐味はここにあると考えています。

カテゴリー
ライフ 仕事効率化

サラリーマン+副業が最強だと思う理由

近年では、フリーランスとして働こうとか、やりたいことで生きていこうという考え方が広まっています。それも良い生き方だと思いますが、どうしても金銭的に安定しないです。

フリーランスが金銭的に安定しない理由

フリーランスが安定しない主な理由は、

  • 受注しないと給料に結びつかない
  • 休むと収入なし
  • 健康保険や年金制度が企業ほど手厚くない
  • ボーナスもない
  • ローンなど借入審査が通りにくい
  • 年齢を重ねるにつれて、受注が難しくなる

など、様々な理由があります。

サラリーマンが金銭的に安定している理由

一方でサラリーマンは安定しており、理由としては、

  • 毎月決まった給料が振り込まれる
  • ボーナスがある
  • ローンなど借入審査が通りやすい
  • 年齢を重ねるにつれて、給料が上がる
  • 休んでも収入がある

などがあります。

フリーランスはスキルアップが難しく、メンバーの助けを得られにくい

フリーランスは基本的に1人で作業します。発注側からはプロフェッショナルとして見られますが、基本的に1人なので、困ったときに助けてくれる人が社内にはいません。

電話をしたりインターネットを介して助けを求めることもできるかと思いますが、顔を付き合わせて話しをすることと声だけで会話するのでは、情報量が圧倒的に違います。

また、スキルアップのために書籍を買ったりセミナーを受講することもあるかと思いますが、それらの費用は全て自腹で用意しなくてはいけません。

サラリーマンだと技術的な内容から人生相談までのってくれる人がいる

会社の中で働くわけですから、それはもう多くの人います。中には変な人だったり難しい人もいますが、気の合う仲間や同期、頼れる上司が必ずいます。

そんなときに軽く質問しにいける人がいると、スキルアップのスピードは早いですよね。会社の中では役職で分かれていますので、「技術的な相談をするのはこの人だ」というのがすぐに分かると思います。

また、気の合う仲間や同期がいれば、飲みに行ったり遊びに行ったりすることでストレスから解放されやすくなります。

サラリーマンのデメリット

サラリーマンもデメリットがあります。

  • 給料が安い・なかなか上がらない
  • 会社に出勤しないといけない
  • 定年退職後にやることが無くなる
  • やりがいを感じられないときがある

サラリーマンは給料が安いです。1日8時間一生懸命働いてもこんな安いのか!と思ったことが何度もあります。トータルは分かりませんが、見た目の給料だけで言えば、フリーランスの方が給料が高いです。

また、サラリーマンは定年がありますので、一定の年齢を超えると会社にいられなくなってしまいます。一方でフリーランスは定年がありませんので、自分の引退年齢を自分で決められるというメリットがあります。

サラリーマンのデメリットを副業でメリットに変える

サラリーマンのデメリット上げた点を副業として注力することで、メリットに変えることができます。

  • 副業の収入を加算して、年収を増やす
  • 在職中から副業を開始し、定年後は副業をメインで行うことで、やりがいを感じる活動をする

サラリーマン副業は、サラリーマン在職中始めなければいけません。退職後からスタートしても、何をしていいのか分からず、すぐに収入に結びつくことが殆ど無いからです。

サラリーマン在職中のうちにしっかり副業の基盤を作っておけば、在職中の収入は上がり、退職後のやりがいも感じられる、楽しい人生を送ることができます。

サラリーマン在職中の副業は、受注型ではなくプロバイダー型にしよう

受注型とは、発注者から作業を請け負い、成果物を納品することです。これも十分立派な副業で、実績も残すことができますが、「作業量=収入額」となってしまい、働かないと収入が無いという現状から抜け出すことができません。

一方でプロバイダー型とは、ブログや動画などの広告収入有料メールマガジン、セミナー講師、有料のアプリ・LINEスタンプ販売など、自分が手を動かさなくても収入を得られる方式のことです。

この「プロバイダー型」の収入が増えると、金銭的に安定するだけでなく、自由に使える時間もそのまま確保できますので、次から次に自分のやりたいことが出来るようになります。

副業は目先の収入ではなく、将来への種まき

冒頭で述べたように、サラリーマンは在職しているだけで安定した収入が得られます。そのため、目先の収入を副業に求める必要がない方もいるのではないでしょうか。そういう方も、そうでない方も、副業は目先の収入ではなく、将来への種まきとして考える方が、人生を楽しく過ごせるようになると私は考えています。

カテゴリー
仕事効率化

【プログラミング知識だけでは不十分】システムエンジニアに必要なスキルについて考えてみた

私は自動車部品製造業で社内SEをしています。その中でも主にシステム内製開発業務を行っており、要件定義から基本設計、プログラミングと単体テスト、結合試験と総合試験、システム移行・運用保守まで全工程を行なっています。

最近は様々なプログラミングスクールがありますので、プログラミングを学ぶハードルがかなり下がっています。

しかし自分としてプログラミングを知っているだけではスキルとしては不十分だと感じており、とても仕事を依頼しにくいと感じています。

この記事ではシステムエンジニアとして必要なスキルセットを記載します。

1. テストスキル

プログラミングしてある程度完成したプログラムは6割〜7割は問題なく動くと思いますが、残りの3割〜4割はバグが潜んでいる可能性があります。

テストスキルとしては以下が必要だと考えています。

  • 単体テスト・結合テスト・総合テストなど各テスト工程で押さえるポイントを理解する
  • テストケースをドキュメントとして作成できる
  • テスト結果をエビデンスとして残せる
  • プログラムの品質が問題ないことを定量的・定性的に説明できる

2. 設計スキル

画面設計だけでなく、バッチ処理であればジョブフロー設計、データパターンを意識した詳細設計、エラー制御なども必要です。

大規模システムであればシステム構成図も必要です。新たな業務手順が発生するのであれば、業務フローも必要になります。

  • 画面設計、ジョブフロー設計、プログラム詳細設計
  • システム構成図、インターフェース設計
  • 業務フロー設計

3. システム要件を聞き出すスキル

システムを使用するユーザーは必要な機能をある程度説明してくれます。ただし、ユーザー自身気付いていないが必要となる機能もありますので、上手く聞き出す必要があります。

  • システム要件を文章や図にして、ユーザーに説明する
  • 不明点を確認事項一覧として記録・管理する

4. 非機能要件を定義するスキル

非機能要件とは、処理時間や処理可能最大件数、ディスク容量などのリソースを定めることです。要求機能が実現できていても処理が遅くては使い物になりません。

非機能要件はユーザーに聞いても曖昧な回答しか返ってこないことが多いので、業務内容から予想して決めていく必要があります。

  • 処理時間設計
  • 最大・限界設計
  • リソース設計(ディスク容量・レコード件数、など)
  • 運用設計

5. システム運用設計スキル

システム運用をスムーズに行うためには、定期的な過去データ削除であったり、エラー発生時に出力するエラー情報、エラー通知方法を考慮しておく必要があります。エラーが発生したらどこからどうやってリカバリ処理を実行するのか、リカバリ手順も構築しておかなければいけません。

システムを開発する時間より運用する時間の方が多いですから、運用を意識した設計を行う必要があります。

  • エラー通知情報設計
  • エラー通知設計
  • リカバリ設計
  • 過去データ保存期間設計

6. OS概要

OS側で用意されている機能を知っていればより良いシステムを構築することができます。例えばデータベースに接続する場合はODBCを使用すると簡単に構築できます。ログはファイルに出力するよりはイベントログに出力した方が管理や発見・検索が簡単です。ログイン機能を構築する場合は、Active Directory を使用するとシングルサインオンを実現できます。

  • Windows概要
  • Linux概要

7. ネットワークスキル

今やネットワークに繋がってないシステムはありません。機能要件にTCP/IP通信がある場合は尚更必要です。通信要件がなくても、OSI7階層参照モデルと具体例を知っているだけでシステム提案やトラブルシューティング幅が広がります。

  • OSI7階層参照モデル
  • プロトコル概要
  • ファイアーウォールの仕組み

8. アルゴリズムスキル

アルゴリズムといっても複雑なスキルは不要です。キー突合や最大値・最小値・最頻値の取得、業務カレンダーに基づいた日付計算など、要件実現のために必要なアルゴリズムを書けるようになっておく必要があります。

プログラミング言語フレームワークによっては既に用意されているものもあると思いますが、言語が指定される場合は使えないこともあります。必要な言語で柔軟に構築できるようになっていると強くなります。

  • キー突合
  • レポート出力(改ページ処理)
  • 最大値・最小値・最頻値取得
  • ランク付け

さいごに

プログラミングスクールで勉強すれば確かにプログラムが作れるようになりますが、これらのスキルがあるとエンジニアとしての幅が広がり、質の高いプログラムが作れるようになると思います。

意見がありましたらコメントか Twitterで連絡いただけると幸いです。

カテゴリー
仕事効率化

【スマホファースト】スマホで出来ることを増やすと隙間時間を有効活用できる

スマホはほとんどの人が常に持ち歩いているモノの一つです。むしろ、スマホを持ち歩かない人はあまり居ないと思います。

パソコンでできることはスマホでもできます。むしろ、スマホから仮想PCにリモート接続すればパソコンが使えます。

スマホで出来ることを増やせば隙間時間を有効活用できます。この記事では、隙間時間の有効活用に繋がるスマホの使い方を紹介します。

1. ブログを書く

ブログをパソコンで書いてる人もいると思いますが、スマホで書けるようになれば、外出先のちょっとした空き時間を使って書くこともできます。ブログに広告を掲載すれば収益も期待できますね。

ブログサービスを使えばサーバー設定不要ですぐに始めることができます。有名なところで言えば、

など、様々なブロサービスがあります。これらは、サブドメインを使用して無料でブログを公開することができますし、有料アカウントであれば独自ドメインを使うこともできます。

これ以外にも、Wordpressを使う方法もあります。レンタルサーバーやVPC上に構築した WordPressにスマホからアクセスして記事が書けます。また、Wordpressにはネイティブアプリが公開されていますので、これを使えばウェブ画面よりは効率よく執筆できます。

iOSアプリは以下の URLからダウンロードできます。

https://apps.apple.com/jp/app/wordpress/id335703880

2. 動画を作る

最近は 幅広い世代で YouTube を視聴しています。10代や20代はもちろん、40代のサラリーマンでも見ている人は見ています。

もう、文字を読むということが段々と少なくなっていく時代なのかも知れません。文字よりも動画の方が情報量が格段に多いですし、面白さも伝わりやすくなります。

動画は iMovieなど無料アプリが多く公開されています。スマホで撮影した動画を加工したり、画像を作って文字を追加することもできます。BGMが必要であれば既に用意されているものが iMovieから選択できます。

https://apps.apple.com/jp/app/imovie/id377298193

3. サーバー設定やプログラミングする

パソコンでしか出来ないように思う人が多いかも知れませんが、SSHクライアントやコードエディターがあれば事足ります。会社のサーバーにアクセスする場合は、同じネットワーク内にスマホを接続すればいいと思います。

私が使用しているアプリは、panicの code editorです。

https://apps.apple.com/jp/app/code-editor-by-panic/id500906297

このアプリはSSHクライアント、SFTPクライアント、コードエディターの機能が含まれています。ほぼ、これで事足りますね。

Windows系のサーバーであればRDPクライアントアプリがあれば十分です。公式のものもありましたが、以下のアプリが使いやすくて好きです。

https://apps.apple.com/jp/app/remote-desktop-rdp-lite/id288362576

4. 文字入力が面倒なときは、Bluetoothキーボードを使う

スマホのキーボードを使ってると、打ち間違いがあったり、シフトキーが無いために記号を入力するのが面倒だったりしますよね。そんなときは、Bluetoothキーボードを使うと良いです。

Bluetoothキーボードと言っても、大きいものから小さなものまで様々あります。大きなキーボードだと持ち運びが大変ですので、このような小さなキーボードもあります。

https://amzn.to/2OAZlFG

隙間時間にスマホを使ってアウトプットを増やして、副収入を得てみよう

会社員としての収入は安定していますが、どうしても時間が拘束されてしまいます。また、いくら頑張っても基本給は変わらず、収入額が変わるとすれば残業代くらいなもんです。

このように、頑張っても報われないけど安定しているのがサラリーマンですが、頑張った分だけ報われるのが副業です。安定性もあまり期待できませんが、「頑張った分だけ報われる」というところにやりがいを感じると思います。

カテゴリー
インフラ 仕事効率化

ウェブサービス個人開発の初期にレンタルサーバーとPHPを選択する理由

個人開発の中でも、ウェブサービスを開発するという前提になりますが。開発初期段階では、レンタルサーバーとPHPという選択肢はかなり有効だと考えています。

この記事では、なぜレンタルサーバーとPHPの組み合わせが有効なのか、及び、おすすめのレンタルサーバーを紹介します。

1. ランニングコストが安い

なんと言っても、レンタルサーバーはランニングコストが安いですね。クラウドで仮想サーバーを構築した場合、1ヵ月あたり1,000円から場合によっては10,000円を超えることもあります。

一方で、レンタルサーバーは1ヵ月130円から1,500円など、とても安く済みます。MySQLなどのデータベースも使用できますので、一般的な開発に十分使えるサービスになっています。

2. PHPの開発効率は高い

PHPは厳格な型定義がなく、比較的簡単なプログラム言語です。htmlと同じファイルの中にPHPスクリプトを直接書き込むことができ、簡単にサーバーサイドの処理を実装することができます。

また、PHPは情報量が多いので、インターネットで検索すればすぐに情報を得ることができます。CMSシステムとして良く知られているWordpressなど、PHPが使われているウェブシステムは数多くありますので、実績も情報も十分です。

PHPファイルをウェブサーバーに配置するだけで実行できますので、テストや環境構築も簡単です。

3. 開発初期は、早く稼働させて自分のアイデアが正しいのか検証するべき

自分の中で良いアイデアが浮かんだとしても、それが世間に受け入れられるかは分かりません。世間に受け入れてもらえるかどうかは、動くものを作って公開することが重要です。スライド資料や画像による説明ではなく、プロトタイプのウェブサービスを構築して一般公開して、意見をもらうことが重要です。

そのためにも、素早くウェブサービスを構築できるインフラとプログラム言語を持っていることが非常に重要になります。PHPとレンタルサーバーの組み合わせだと、PHPファイルをコーディングしてサーバーに配置するだけですぐに実行することができます。

PHPを使って開発されたウェブサービス

有名どころでは、Facebookの初期の頃にPHPを使用していました。これ以外にもブログシステムとして利用されているWordpressでも使われています。また、動画学習サイトのSchoo、クラウドファンディングのCAMPFIREでもPHPが使われています。

4.おすすめなレンタルサーバー

  • さくらインターネットのレンタルサーバー

さくらインターネットのレンタルサーバーはかれこれ3年以上使用しています。

https://www.sakura.ne.jp/?_ga=2.37923171.1101151846.1565477533-1651816086.1560945349

44万件がさくらインターネットのレンタルサーバーを利用しています。プランは6種類あり、最安値で月額129円(年間1,543円)

から利用可能です。SSHやMySQLを利用するには、スタンダード(月額515円)以上が必要です。

各プランの比較は以下のページにあります。

https://www.sakura.ne.jp/plans.html

カテゴリー
仕事効率化

実験思考を読んでみました

CASH を開発した 光本勇介 さんの著書 実験思考を読んでみました。

電子書籍版は無料で読めますので、ぜひ読んでみてください。

CASH って?

モノの写真を撮るとすぐに査定されて、お金が振り込まれるアプリです。

https://cash.jp

一時期話題になったのでご存知の方も多いと思いますが、簡単に言うと買い取りアプリです。少し違うのが、お金が振り込まれる早さです。

まずお金が振り込まれて、2週間以内にアイテムを発送します。普通はアイテムを送って、発送してしばらくしてから振込みですが、CASH の場合は、先にお金が振り込まれます。

さらに、宅配業者が集荷に伺ってくれますので、手間もかかりません。

CASH をローンチして24時間で 3.6億円 のキャッシュ支払われたそうです。ローンチした翌日には、百科事典のような伝票を持った運送業者の方が、トラック3台分のアイテムを持って来られたと書かれていました。

失敗は自分だけの価値なる。

大切なのは、とにかくやってみよう、の精神です。自分がやってみたいと思ったことは、とにかくやってみることです。この本の中でも、「実験結果こそが唯一無二の財産になる」と書かれています。

お金は早く払うだけで喜んでもらえる

STORES.jp という名前でオリジナルのネットショップを持てるサービスがありました。そこでは、売り上げは翌々月まで待たないと振り込まれないのですが、手数料をいただくことで翌月に振込むサービスを始めたところ、多くのユーザー利用したそうです。

マスが使うサービスを作りたければ、マスの感覚を知る

女子高生からサラリーマンまで多くの人に使ってもらえるサービスを開発したければ、マス感覚を知ることが重要だと書かれていました。具体的には、ヤフーニュースをチェックしたり、App Store のトップ10を日々チェックしてインストールして使ってみる、ということです。

アイデアメモを書き、こんなサービスがあったら、どんな反応が起こるか考える

世の中不便なことだらけです。実体験で困ったことや、こんな風になったらいいのに、と思ったことを大切にして、アイデアメモとして残しているそうです。その中で、こんなサービスが実現したらこんな風に世の中が変わるだろうと予想して、実際に作って実験してみる、という思考を繰り返しているそうです。

思考停止の時代がくる

人間はそもそも、面倒くさがり屋です。そのため、便利なものが作られると、必ず便利な方に流れます。AIが開発されて職が奪われるといった議論がありますが、必ずそういった方向に時代は流れます。

そのときどんなサービスを提供できるか?どんな体験を提供できるか、について書かれていましたが、その中で、考えなくても旅行に行けるサービスのことが書かれていました。行きたい日にちと場所を入力するだけで、予約や手続きを全て自動化してくれるサービスです。

その他にも、AI化が進んでベーシックインカムが実現すると、エンタメが強くなるとも書かれていました。朝10時に出社して昼3時に仕事が終わると、あとは全てエンタメの時間。それだけ、これからはエンタメが強くなると予想されています。

他にも面白いアイデアがたくさん書かれています。

電子書籍版は無料で読めますので、ぜひ読んでみてください。

カテゴリー
仕事効率化

ハッタリの流儀 読んでみました。

堀江貴文さんの著書 ハッタリの流儀 を読んでみました。

いろいろネタバレもありますので、しっかり本で読みたいという方は、この記事は読まないでください。

ハッタリとは

以下、本書の内容を抜粋したものです。

  • ハッタリとは、出来ると言い切って、それを実現するために努力して、辻褄を合わせること

  • 何事も、できる、と言い切って、やります、と即答して、それを実現するために努力して、そこに積み上がった実績が信用になる。

  • 労働=やらされている仕事はオワコン。誰もやらなかった遊びが仕事になる

  • 一億総評論家時代にボケは重要。

  • バカ丸出しで夢を追いかける過程が最高のエンターテイメント

あまり詳細には書けませんが、私が印象に残った文章です。本当はもっとたくさんありますが、これくらいにとどめておきたいと思います。

労働について思うこと

労働はオワコンと書かれていますが、確かにやらされ仕事は本当に辛いものがあります。こんなの誰の役に立つんだとか、無駄な管理作業増やしてんじゃねぇよ、とか。仕事をしていると感じることがたくさんあります。

仕事というのは会社の中の一従業員として働くわけですので、集団社会です。会社のピラミッドを維持させるために、やりたくないけど、やらないといけないことがあるのは事実だと思います。(これはサラリーマンとして働いている場合ですね)

そういう風に感じている作業に対して、どうやって面倒な仕事をやらずに終わらせられるか、これを考えて実現させることができれば、少し殻を破れるのではと思います。

無駄な管理作業であれば自動化させる方法は無いか、問い合わせが多いシステムであれば、説明資料を公開して問い合わせを減らせないか。

そこにも「努力」があるのだと思います。

努力について

努力はコスパがいい、と本書にも書かれています。誰もあまり努力をしない。60点ほどで終わらせる人がほとんど。120点を目指す人なんてほとんどいない。

確かにそうで、やらされ仕事なんてやりたくないことばかりですから、真剣に取り組もうと思わない人が多いでしょう。

一生この会社で、この役職で、安い給料で定年まで働こうと思っていたら、努力なんてしないと思います。昇進したいという気持ちがあれば、それなりに努力していく原動力になると思いますが、そんな気持ちがなければ、努力する意味がありません。

好きだと思えることにしか、人間は努力できないようになっています。

好きだと思えること?

好きなこと、というのは人それぞれです。釣りが好きだったり、走ることが好きだったり。ゲームが好きだったり、料理が好きだったり。

私が好きなことは、プログラムを書いてアプリを作って、誰かの役にたって、ありがとうと言ってもらえることです。誰も考えもしなかったシステムを低価格で導入して、人の仕事をラクにさせることです。

あとは猫と遊ぶのが大好きですね。猫といると嫌なことを忘れてしまいます。こうしてブログを書いているときも、可愛い姿で寝ているのを見るだけで癒されます。

猫が好きかどうかも人それぞれですが、猫好きな人といろいろな場面で関わっていきたいと思っています。

今の猫を飼い始めたのも、妻が猫好きだったから、ということがそもそもの始まりでした。私自身は猫動画を見るくらいなもので、猫を飼おうと思っていませんでしたが、妻から飼うことを持ちかけられ、すぐに「いいよ」と返答したことで、今の愛猫がいます。

あまり難しく考えずに、いろんなことやってみる、というのは大切です。

楽しそうだと思うことは、すぐにやる

猫を飼うときは、トイレや身の回りの掃除だったり、病院に連れていったり、いろいろ手がかかるだろうと思っていました。実際に手がかかります。しかし、それを全く苦痛に感じたことはありません。

会社でのシステム開発も一緒で、やる前はどんな風にプログラムを組んでいこうか悩みますが、一つ一つを細かく細分化していけば、大抵のシステムは作れます。

やる前から、やりたくないとか、やめようとか考えるのは、本当にもったいないことです。

自分の中でもアイデアが浮かぶことがあります。会社にCMSを導入してすぐに情報を得られるようにしたり、問い合わせの工数を削減させられたらいいのに、と思うことがあります。

これを上司に持ちかけても、誰も使ってくれないよ、とのってくれないこともあります。腹が立ちます。

会社の中での個人

会社ですから集団社会にふさわしい行動が求められます。会社の中にシステムを立てるということは、会社の資源を使うということですので、上司を説得させる必要があります。

その上司というのが、まぁ選べない。イケハヤさんもツイートしているように、クソ上司もいます。

そんなときは、会社ではなく個人でやってしまおうと考えるようにしています。会社の中での実績なんて、その会社を退職してしまえば、なくなってしまいます。

個人で頑張って個人の名前で実績を積み上げることができれば、それは一生モノです。

上司とそりが合わなかったり、今の仕事に満足していなければ、生活出来るだけの収入を得ることだけを目的に働いて、さっさと家に帰って、個人の実績を積み上げる方がいいです。

やりたいことを、やる方が楽しいに決まっています。

やりたいことを掲げ、その実現に向けてガムシャラに努力する過程をSNSで垂れ流し、必ず実現させて、自分個人としての実績=信用を積み上げていきたいです。

カテゴリー
仕事効率化

スニペットコードの威力

最近はプロジェクトでコードを書くと、必ずリファクタリングして他のプロジェクトでも
流用できるよう、スニペットとして保管しています。

なぜそのようなことをしているか、スニペットコードの威力について紹介します。

コーディングの効率が向上する

スニペットコードを用意しておくと、次のプロジェクトで同じコードを書く必要が無くなるので
コーディング作業の効率が向上します。

用意しておくスニペットコードは複雑なものである必要はありません。

  • 現在日付を YYYYMMDD 形式 で取得する
  • 名前をつけて保存ダイアログを表示して、ファイルパスを取得する
  • Zip圧縮を行う
  • Access や ODBC や Sqlite3 など様々なデータベースプロバイダに対してクエリを実行する

など、インターネットで探せばいくらでも情報が出てくるようなものを、スニペットコードとして
用意しておくのです。

スニペットコードは関数にしておいて、出来るだけ簡略化したインタフェースにしておけば
使いやすさも向上します。

Google検索する必要がなくなる

たくさんのプログラム言語を使い分けて開発していると、書き方がたまに分からなくなってきます。
たとえば、文字列の部分参照を行う場合であれば、

  • Mid
  • Substr
  • Substring
  • slice
  • 文字列変数(from:to)

など、いろいろあります。ちなみに最後の 文字列変数(from:to) は、COBOL です。

よく使うプログラム言語であればすぐに出てきますが、しばらく使ってなかった場合は、
Google先生に頼る必要があります。このとき、分かりやすい情報がすぐに出てきてくれれば
いいのですが、前置きが長くて事細かに書かれている場合は、見ていてイライラします。

自分は、文字列の部分参照ができる方法を知りたいだけなのですが。

そういうときも、スニペットコードとして用意しておけば、コピペでコーディングが進みます。

さらに言えば、プログラム言語は違っても、関数名とインタフェースを同じにしておけば、どんな
プログラム言語でもその関数を呼び出すことで、やりたいことを実現できるようになります。

これって、かなりラクになると思いませんか?

コピペで開発できるようになる

ひととおり動作するコードがスニペットとして用意されていますので、コピペでコーディングが出来ます。
ただし、100%コピペで開発できるわけではありません。プロジェクト固有のコードに限っては、
やはり1つ1つコーディングしていく必要があります。

それでも、プロジェクト固有ではなく汎用処理のロジックにおいては、コーディングする量は減ります。

1度書いたソースコードは2度と書かない、そう自分のルールとして決めれば、スニペットコードが多くなり
開発効率が向上すると思います。

ブログを書くネタになる

技術ブログが多いので、同じような処理を実現するコードはたくさん出てきます。しかし、その処理を
実現する方法は人それぞれ違いますので、様々な種類のソースコードがあると思います。

自分が書いたスニペットコードは自分オリジナルですので、胸を張ってブログに書いたらいいと思います。

使いやすいように簡略化した内容があれば、なおさらグッドです。

本当に使いやすいコードになっていれば、それだけファンもできると思います。

これからはプログラミングはAIがやる時代

これからはプログラマーはいなくなり、AIがプログラミングしていくことになりそうです。

であれば、人間は今からプログラミングを勉強するべきでは無い?と言われると、そうではないと
私は思います。

だって、まだそんなAIは出来ていないからです。

要件定義や画面設計はまだまだ人間がやるべき領域であり、そこから実装してシステムを作り上げるまでの
時間は、できるだけ短くあるべきです。短くするための手段として、AIに頼るのか、自分が磨き上げた
スニペットコードに頼るのか。

私はブラックボックスが好きではありませんので、自分が磨き上げたスニペットコードで開発した
システムの方が信頼できます。

カテゴリー
TypeScript 仕事効率化

TypeScript で バッチジョブを開発するときのボイラープレート

TypeScript で バッチジョブを開発するときのボイラープレート

TypeScript を使用していますか? 私はTypeScriptを愛用しています。理由としては、

  1. Node モジュールを使用できるためかなり効率よく開発が進むこと
  2. ソースコードの自動補完機能があること
  3. 型定義されているためソースコードが分かりやすくなること

の3点です。

この記事では、TypeScript でバッチジョブを開発するときのボイラープレートを紹介します。

このボイラープレートが提供する機能

このボイラープレートは以下の機能を提供します。

  1. src ディレクトリにソースコードを配置
  2. dist ディレクトリ にコンパイル済み js ファイルを出力
  3. tsc –watch によるソースコードの自動コンパイル
  4. @types/node のインストール

各種ファイルダウンロード

下準備1:typescript をインストールする

TypeScript のインストールが未だの場合は、インストールしましょう。


npm install -g typescript

下準備2:package.json を作成する

まず、npm init -y で package.json を作成しましょう。


D:\ts-batch-boilar>npm init -y
Wrote to D:\ts-batch-boilar\package.json:
{
  "name": "ts-batch-boilar",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

下準備3:tsconfig.json を作成する

次に、tsconfig.json を作成します。


D:\ts-batch-boilar>tsc --init
message TS6071: Successfully created a tsconfig.json file.

package.json を修正する

以下のように package.json を修正します。

  1. scripts に watch スクリプトを追加
  2. dependencies に @types/node を追加
{
  "name": "ts-batch-boilar",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "watch": "tsc -watch"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/node": "^12.0.4"
  }
}

tsconfig.json を修正する

以下のように tsconfig.json を修正します。

  1. outDir にコンパイル先ディレクトリを指定
  2. rootDir にソースディレクトリを指定
  3. typeRoots に Node Modules の @types を指定
  4. include にコンパイル対象ソースを指定
  5. exclude にコンパイル対象外のソースを指定
{
  "compilerOptions": {
    /* Basic Options */
    "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    // "lib": [],                             /* Specify library files to be included in the compilation. */
    // "allowJs": true,                       /* Allow javascript files to be compiled. */
    // "checkJs": true,                       /* Report errors in .js files. */
    // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    "outDir": "./dist/",                        /* Redirect output structure to the directory. */
    "rootDir": "./src/",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "composite": true,                     /* Enable project compilation */
    // "removeComments": true,                /* Do not emit comments to output. */
    // "noEmit": true,                        /* Do not emit outputs. */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true,                           /* Enable all strict type-checking options. */
    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
    // "strictNullChecks": true,              /* Enable strict null checks. */
    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
    // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */

    /* Additional Checks */
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */

    /* Module Resolution Options */
    // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    "typeRoots": [
      "node_modules/@types"
    ],                       /* List of folders to include type definitions from. */
    "types": [
      "node"
    ],                           /* Type declaration files to be included in compilation. */
    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */

    /* Source Map Options */
    // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}

src ディレクトリ と dist ディレクトリを作成する

src ディレクトリ と dist ディレクトリを作成します。

  • srcディレクトリは、ソースコード(tsファイル)を格納するフォルダです。
  • dist ディレクトリは、コンパイル済み js ファイルが出力されるフォルダです。

npm install で パッケージをインストールする

npm install でパッケージをインストールします。

以上

想定どおりの動作をしているか確認してみましょう。