朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

オフショア開発を4年間続けた成果と課題

開発部のm1calです。過去にオフショア開発について言及している記事がありますが、開発部における取り組みについてもう少し詳しく紹介しようと思います。

開発部では2018年度よりオフショア開発を採用しており、ベトナムのソフトウェア開発会社と契約しています。 私は昨年8月に前任者より引継ぎオフショア担当となり、オフショア開発案件の全体的な管理を担当しています。

  • オフショア開発採用の目的
  • オフショア開発体制
  • オフショア開発の進め方
  • オフショア開発を採用した成果
  • オフショア開発の課題
    • 認識齟齬による不具合増加
    • 案件依頼時の負担
  • 課題解決への取り組み
    • 認識齟齬による不具合増加への対策
    • 案件依頼時の負担への対策
  • 採用情報

オフショア開発採用の目的

開発コスト低減の目的以外に、大規模開発案件で朝日ネット社員のみでは要求されている期日にスケジュール的に難しい場合や並行して複数の開発案件を進める必要がある場合など開発活動の量産体制を強化するためにもオフショアを利用しています。

続きを読む

GHC 9.2 で導入されたQuick Look型推論アルゴリズムについて

初めまして、朝日ネット開発部の hogeyama です。 今回は Haskell の中級的なトピックとして、 GHC 9.2 で導入された Quick Look 型推論アルゴリズムを取り上げようと思います。

概要

Haskell のデファクトスタンダードなコンパイラである GHC では通常の多相(ジェネリクス)の一般化である非可述的多相(impredicative polymorphism)を実装していますが、その型推論アルゴリズムは長らく「型推論が弱い」「実装が不安定でコンパイラのバージョンアップでデグレが起きる」といった問題を抱えていました。

しかし昨年10月、Quick Look という新しいアルゴリズムが GHC 9.2 に実装されたことでこの問題が解決しました。 本記事ではこの Quick Look によって何が変わるのか、利用する際に何に気をつければよいのかを非可述的多相の概要から始めて説明していきます。

  • 概要
  • 復習:いわゆる普通の多相について
  • 可述性による制限
  • これまでのGHCにおける非可述的多相
    • 型推論が弱い
    • コンパイラバージョン間で互換性がない
  • Quick Look 型推論アルゴリズム:これからのGHCにおける非可述的多相
    • アイデア
    • 型推論能力の高さ
      • Maybe の例
      • -> の例
    • GHCの変更への強さ
  • 推論に失敗するケースと対処方法
    • ヒントの探索が打ち切られてしまう場合
    • 間違ったヒントを見つけてしまう場合
  • 代償
  • まとめ
  • 参考文献
  • 採用情報
続きを読む

GoFデザインパターンとオブジェクト指向の再解釈(第1回)

はじめまして。朝日ネット2021年度新卒社員のjiweenです。

オブジェクト指向は今や普通にプログラミングをしていれば必ずと言っていいほど遭遇するありふれた概念ですが、とても一筋縄ではいかない奥の深いプログラミングパラダイムでもあります。オブジェクト指向に悩まされ夜も眠れない全ての人のために、本連載ではなるべく初学者の目線からオブジェクト指向を分析し、オブジェクト指向を実践するための考え方を提案します。6回程続く長い連載になりますがお付き合いいただけると幸いです。

第1回 (今回) では全体の概要とモチベーションについての話をさせていただき、前提知識や仮定の確認を行います。第2回では本連載の結論として、オブジェクト指向設計における重要な考え方を説明します。第3回以降では、結論の具体的な説明と実践的な知識のため、GoFデザインパターンと呼ばれる設計パターンの分析を行います。

続きを読む

Haskellと余代数(Coalgebra)

ここではHaskellの中級者向けのトピックを簡単に取り上げたいと思います。

今回は余代数(Coalgebra)についてです。Haskellを書いていると『余(なんとか)』という言葉をみかけることがあります。これは英語の接頭辞 Co- の訳で、ここでは代数(Algebra)の双対(Dual)という意味で余代数と呼ばれています。

さてHaskellやOCamlのデータ型は一般に代数的データ型(Algebraic data type)と呼ばれます。このデータ型にパターンマッチングを加えて、(オブジェクト指向言語などと比較したときの)関数型言語の特徴と紹介されることも多いと思います。実はこのデータ型にはもともと余データ(Codata)と呼ばれるような相方がいたのですが、人類が扱うには早すぎたのか、データ型に比べると余データは長らく影の存在でありました(ちなみに余データは口語上はコデータと呼ぶかもしれませんが、ここでは文章なので余データと書くことにします。)

続きを読む

Haskellで図を作成してみましょう (その3)

開発部のgedokuです。

HaskellをeDSLのホスト言語として使うことの魅力を、作図を通じて伝えるシリーズの第二弾です。

  • 前書き
  • 図結合入門
  • 今回使う図結合の仕方
  • 目標に近づける
    • ノード二つを配置
    • ノードの塗りつぶし(寄り道)
    • 3つ以上のノードの配置
    • ノード配置の相対的な指定
      • 合成可能性 (1) の修正
      • シフトのハードコード (2) の修正
      • さらなる改善?
  • まとめ
  • 次回予告
続きを読む

継続的デリバリーのすゝめ

朝日ネットで開発の業務を担当している tommy です。

皆さんは、「継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化」という本をご存じでしょうか? 2012年発行(原著は2010年)で有名な本なので知っている方も多数いらっしゃると思います。 え?もう全部読んだことがある?...それなら私からお伝えすることはもうないです。ブラウザバックするか、よろしければこのブログの別の記事を読んでいってください。

この本はソフトウェアを安全に提供するために、基本的だけどとても重要なことがしっかりと書かれています。 ざっくりと内容をキーワードにまとめてしまうと、「自動化」と「テスト」です。 弊社内でもこれらの重要さは十分広まってきたのですが、それでも人によってそのモチベーションについては様々です。

私のように、テストを書かないと不安で夜も眠れないような人間もいれば、 テストを書けと言われているからただ書いている人、 また、忙しさにかまけてテストをあまり書いてくれないような人も残念ながら存在します。

今回はすべての(開発者に限らず)ソフトウェア提供に携わる人に自動化・テストの意義を今一度認識してもらいたくて、この記事を書こうと思いました。 本の中で、私が特に伝えたい点を4つピックアップして紹介します。このほかにもこの本には気を付けるべき重要なことがたくさん書かれています。

共感できる点がありましたら、ぜひ本を手に取ってみてください。

続きを読む

Python の open 関数と io モジュールをきちんと使うために

はじめに

開発部の ikasat です。 Python の言語・ライブラリ・処理系はプログラマのタスクを手早く簡単にこなせるようにするために設計されており、数行程度のコードを書いただけでも内部で様々なことをやってくれます。 しかし、この便利さが特定のユースケースにおいては逆にお節介になってしまうこともあり、また内部動作が複雑であることにより挙動を修正する方法も分からなくなりがちです。

特に組み込みの open 関数や標準入出力 (sys.stdin, sys.stdout) はその最たる例であり、UnicodeEncodeError / UnicodeDecodeErrorTypeError: a bytes-like object is required は Python を使った人であれば誰もが見たことのあるエラーメッセージでしょう。 私自身これまでこの類のエラーが出た時には検索して出てきた情報を基に場当たり的な対処をしてきましたが、この機会に入出力の仕組みと io モジュールについて調べることでようやく問題に確実に対処できるようになりました。 というわけで今回は Python の入出力についてやや深めに解説していきます。

対象読者

本記事の構成

  • 最初に I/O に関するよくある問題への対処方法について記載します
  • 次にこの対処方法に関連した io モジュールの解説を行います
  • おまけとして CPython の内部実装に触れたり他言語 (Java, Go) の I/O 系モジュールの比較を行ったりします
  • はじめに
  • 対象読者
  • 本記事の構成
  • 対象環境
  • よくある問題への対処
    • open の encoding 引数を指定しよう
    • 一括してファイル入出力のエンコーディングを変更するには?
    • str / bytes の変換に使う encoding について
    • 標準入出力のエンコーディングを変えるには?
    • codecs.open ではなく組み込みの open を使おう
    • ファイルへの書き込みを正しく行おう
  • Python の I/O を知る
    • Python における str と bytes の変換
    • io モジュールについて知る
    • open 関数の引数
      • モードとバッファリング
      • テキスト I/O に関する設定
      • raw I/O に関する設定
    • sys.stdin / sys.stdout / sys.stderr の正体
    • ファイルオブジェクトの内容のコピー
    • 標準ライブラリでのファイルオブジェクトの使われ方
  • おまけ: 高度な Tips
    • io と _io の関係について
    • Python の open 関数と open システムコールの対応
    • 他言語との比較
  • おわりに
  • 採用情報
続きを読む