こんにちは!ホライズンテクノロジー広報担当です。
当社がスポンサーとして関わる、九大生向けプログラミング学習プログラム「アプレンティス for 九大生」は、3月に最終成果発表会を迎えました🎉
受講生の皆さま、ご参加ありがとうございました😊
学びの機会はあっても、それを「実践」につなげる場は、なかなか多くはありません。
またそのような機会に出会い、実際に一歩踏み出し挑戦する環境に身を置いたとき、どのような変化が生まれるのでしょうか。
今回は、実際に参加したNさんに挑戦の中で感じたリアルな学びを綴っていただきました。
目次
企画概要
本企画に参加したNさんについて
プログラミングスキルを高めたい——参加のきっかけ
アプレンティス for 九大生とは
Linux / Git 編
JavaScript 編
Python編
DB編
Django編
チーム開発編
アプレンティスを終えて
最後に
企画概要
2025年12月より、株式会社ユーブル様が主催する、九大生向けプログラミング学習プログラム「アプレンティス for 九大生」がスタートしました。
当社では、会社設立からこれまでの3年間で、延べ30名の九大生がアルバイトとして参画してくださっており、そのご縁に大きな感謝を感じています。
ホライズンテクノロジーは社会貢献事業にも力を入れており、その一環として本プロジェクトが発足しました。
登録者数10万人を超えるYouTuber・山浦様が運営する「アプレンティス」と共同で、「学びを“実践”につなげる場をつくりたい」「挑戦する人を増やしたい」という想いから、本プログラムを立ち上げました。
学生が無料で学べる環境を提供し、プログラミングの知識を身につけることで、自分の可能性や将来の選択肢を広げるきっかけになればと考えています。
学んだことを実践に移し、小さな挑戦を積み重ねていける場でありたい。
そんな想いから生まれた取り組みです。
本企画に参加したNさんについて
今回noteを書いてくれたアルバイトのNさん。九州大学に在学し、材料系の分野を専攻しています。
機械学習と材料開発を掛け合わせた分野に興味を持ったことをきっかけに、プログラミングに関心を持つようになりました。
現在は当社でアプリケーションの動作確認などを担当しながら、日々学びを深めています。
もともとは未経験からのスタート。
そんなNさんが、「実践の場」に挑戦したことで、どのような変化を感じたのかを伺いました。
皆様こんにちは!ホライズンテクノロジーで学生アルバイトをしているNです。
プログラミングスキルを高めたい——参加のきっかけ
現在は、エンジニアの皆さんが開発したアプリケーションの動作確認などを担当しています。まだまだプログラミングに関しては勉強中の身ですが、日々新しいことを学びながら業務に取り組んでいます。
今回、社内の方から「アプレンティス for 九大生」というプログラミング学習プログラムがあると紹介していただきました。自分のプログラミングスキルをさらに高めて、実戦で活用してみたいという思いから、このプログラムに参加することにしました。
今回の参加を通して、プログラミングへの理解をより深めるとともに、実務にも活かせる知識やスキルを身につけていきたいと考えています。
アプレンティス for 九大生とは
「アプレンティス for 九大生」の最終的な目標は、「自走できるエンジニアを目指す」ことです。
そのため、最初は Web制作に必要な基礎的なスキルを身につけるため、個人で学習を進めていきます。
また、個人学習だけでなく、他の参加者とコードを共有し、分からない部分を一緒に解決したり、実際に現場で活躍されているエンジニアの方からフィードバックをいただいたりと、無料とは思えないほど充実した学習環境が整っています。
ここからは、具体的な学習内容について、私自身の感想を交えながら簡単にご紹介していきます。
Linux / Git 編
まず初めに学習したのは、Linux と Git の基本的な使い方です。
Linux は主に開発環境として使用するOSであり、Git は自分がコードを作成・変更・削除した際にそれらの履歴を記録してくれるものです。どちらもエンジニアになるには必須のツールです。
Git を使ってコードを GitHub にプッシュする(=自分で作成したコードをインターネット上の保管場所に送ること)ことで、他の参加者がそのコードを閲覧したり、レビューしたりできるようになります。
ただ、初めてこれらを扱うにあたって鬼門となったのが「環境構築」でした。
他のメンバーの方々もかなり苦戦されていたようで、私自身も環境構築に 2〜3 日ほどかかりました。
まず苦労したのは、公式ページが英語で書かれているため、内容を理解するのに時間がかかったことです。さらに、Linuxのインストール方法も複数あり、どれを選べばよいのかわからず迷ってしまいました。また、エラーが出ても専門用語が多く、何が原因なのかを理解するまでに時間がかかった点も難しいと感じた部分でした。
JavaScript 編
次に学習したのは JavaScriptです。
JavaScript は、Web サイトに動きをつけるためのプログラミング言語で、例えばボタンをクリックした際に画面の表示を切り替えたり、入力内容に応じて処理を行ったりするために使用されます。
上記はジャンケンゲームのコードの一部分なのですが、Pythonを学んでいた私にとってJavaScriptはPythonと似ているようで似ていない言語だと感じました。そのため「あれってどうするんだっけな〜Pythonならこうすればいいんだけど〜」みたいなことが多々あり、例えば変数の定義(const~やlet~とある部分)や結果の表示など、そういった微妙な違いに苦戦していました。
私は以前に JavaScript を少し学習していた時期がありましたが、今回の学習を通して、まだ知らない用語や概念が多くあることを改めて実感しました。
特に、これまで曖昧に理解していた部分を言語化することに苦労しつつも、理解を深める良い機会になりました。
Python編
Python については、大学の授業などで触れる機会もあり、基本的な文法にはある程度慣れていました。しかし、実践的な課題に取り組む中で、基礎知識だけでは対応できない場面も多く、レベルが一段階上がったように感じました。
このタームでは課題として、トランプゲームの「戦争」を作成しています。
プログラムでゲームを実装するにあたって、 皆さんに問いたいのですが、「カードを用意して配る」といった動作を、どのようにプログラミングで表現すれば良いかわかりますか?
現実世界で考えれば至極単純です。おそらく意識しなくても手でカードをシャッフルして配ると思います。しかし、ここには手もカードもありません。ゲーム自体のルールや勝敗の決定はなんとなく頭の中で想像できていたのですが、意外とこの部分が自分の中で難しく感じるところでした。
例えば上記のコードは、トランプのカードを用意するための処理を実装したものです。コード自体は完成形ではありますが、トランプは「数字」と「マーク(スート)」の組み合わせで構成されるため、それらをどのように表現するかに苦労しました。
また、最初と最後のカードにはエースやジャック、クイーン、キングといった特別な名称があるため、通常の数字とは分けて考える必要がありました。カードを1枚表現するだけでも、設計の段階でさまざまな要素を整理する必要があり、多くの学びが得られたと感じています。
そしてこちらは「カードを配る」ということを書いたコードです。カードが入った「箱」から、プレイヤーが持っている「箱」へとカードを入れることで「配る」ということを表現しました。
実際の動きを一つひとつ分解し、コードに落とし込んでいく過程は難しさもありましたが、そのぶん大きなやりがいを感じられる学習でした。
もともと私は個人でPythonに触れた経験はあったものの、分からない部分があっても相談できる相手がおらず、理解が曖昧なまま進めてしまうことも多い状態でした。しかし、アプレンティスに参加したことで、同じような悩みを持つ参加者と出会い、つまずいた点や疑問を共有しながら学習を進められる環境を得ることができました。
まだ個人学習の期間は続きますが、一つひとつ積み重ねていくことで、学んだ内容が少しずつ自分の知識として定着している実感があります。
DB編
このタームではDB(データベース)の学習を行いました。
DBは主にSQLというものを使います。
課題としてインターネットTVという、架空の番組を格納するDBの設計を行う課題が出されました。特に難しく感じたのはDB同士の関係です。どこのDBがどことつながっていて、どういう関係があるのかを整理しないといけませんでした。
そもそもDB自体覚えるべき用語や概念が多く、それらを理解するのにも一苦労でした。
なのでDBを「家」に例えて説明するとDBが「家」、テーブルが「部屋」、カラムが「家具や収納棚」です。
さらにデータベースを理解する上で重要だと感じたのは、「マイグレーション」という概念です。どういうものかというと「DBの設計を変更・管理する仕組み」です。
上記の家で例えるなら工事の記録書のようなものです。いつ・誰が・何を変更したかを記録するためにマイグレーションを行います。
また、DB設計においてもう一つ重要だと感じたのが、仕様書の作成です。
仕様書には、他のメンバーが同じ内容でDBを構築できるように、手順や使用するデータベースの種類などを明確に記載する必要があります。
この工程では、単なる技術力だけでなく、「いかにわかりやすく伝えるか」という視点が非常に重要であると実感しました。
チームミーティングなどで他のメンバーの仕様書を確認する機会もありましたが、どの資料も分かりやすく整理されており、多くの学びがありました。
その結果、自分の仕様書に不足していた要素にも気づくことができ、改善につなげることができました。
Django編
続いてDjangoを学習いたしました。(「ジャンゴ」と読みます)DjangoとはPythonを使って記述するフレームワークです。
まず皆さんに問いたいのは「フレームワーク」というのはどういうものか説明できますでしょうか?
意外と初心者の方はこれがどういうものか説明するのが難しく、チーム会でも「フレームワーク」って実際何をするものなの?という質問が上がっておりました。
かくいう私自身も、最初は「フレームワーク」というものがどういうものかわかりませんでしたが、これを学習するにつれて非常に便利なツールであることがわかりました。
ズバリ、フレームワークというのはWebサイトを作成する際に必要なプログラムがすでに用意されているものです。つまり1から(白紙の状態から)コードを書かなくても良いのです!よく家の骨組みで例えられますが私的には塗り絵がわかりやすいと感じたので塗り絵で話します。
白紙の状態から絵を描こうとすると、構図や輪郭、色彩などすべて自分で考える必要があり、とても大変です。しかし塗り絵であれば、すでに輪郭が用意されているので、私たちは色を塗る作業だけですみますよね?
フレームワークもそのようなもので、Webサイトを作成する上で重要かつ基本的な機能がある程度用意されています。そしてあとは自分たちで欲しい機能を付け足していくような感じです。
さて、前置きが長くなりましたが、実際に学習して一番つまづいたのはCRUD処理と呼ばれる機能の実装です。CRUDとはC:Create(作成)、R:Read(読み取り)、U:Update(更新)、D:Delete(削除)といったWebサイト、特に何かを投稿する機能があるようなサイトに必要な基本的な機能のことです。
これらを実装していくにあたり、ルーティングを記述することがもっとも困難でした。例えば自分が学習中に実際に遭遇したエラーなのですがこれは、「Templateなんていうディレクトリが見つからないよ!」という意味です。
なので私はコードを見直してどこか間違っているところがないか1時間ほど探しましたが見つけられず、ChatGPTに相談しました。
すると返ってきた言葉は「setting.pyに’app’を追加した?」でした。ここで私は、はっ!と思い、該当箇所を確認してみると、なんと追加し忘れてました!
簡単に説明すると、この作業をすることでDjango側に「今回の開発ではこのappを使うから登録しててね」と伝えることです。ここでいうappとは自分で作ったアプリのコードなどが入っているフォルダです。もちろんここに先ほどのtemplateディレクトリが入っています。
それを私が登録し忘れたので、Djangoがそもそも’app’というものがあること自体知らなかったから先ほどのようなエラーがでたとわかりました。
そして登録を済ませ、サーバーを起動すると…
🎉見事、Home画面を表示するのに成功しました!!
ここまで来るのに2~3時間。慣れれば早いのでしょうけど、初心者のため悪戦苦闘しながらここまできました。
でも、成功するとやはり嬉しいですね。それと同時にChatGPTの凄さが改めてわかりました。(アプレンティスではこういった生成AIの使用は認められています)
課題も完成し、次の週からはいよいよチーム開発に入ります!
チーム開発編
何を作るか?
何を作るか?まずはそれをチームの皆さんとDiscord上で話し合いました。自分も含めて、メンバー全員が機械学習やAIに興味を持っていたので、最初はその方向で考えていました。
ただ、機械学習は2週間という短い期間での実装がなかなか難しそうだったため、今回は生成AIを活用したものを作ることにしました。
話し合いの結果、RPG風のTODOアプリを作ることに決定しました。日々のタスク管理をゲームのように楽しめるものにするのが目的です。こうすることで、タスクへのモチベーションが上がり、継続して取り組めるようになることを目指しています。
アプリの概要としては、自分で設定したタスクを完了することで経験値が貯まり、一定数に達するとレベルが上がる仕組みになっています。さらに、レベルアップに応じて、最初に選択したキャラクターが進化していきます。そのため、ユーザーはキャラクターを進化させるためにも、日々のタスクをこなしたくなるような設計になっています。
タスクの難易度も自分で設定することができ、その難易度によって得ることができる経験値も異なります。
開発の様子
そんなこんなで開発が始まりました。メンバーの提案で、開発にはDockerを用いることになりました。
Dockerとは、作成したアプリを動かすために必要なもの(環境・設定・ツール)を「コンテナ」と呼ばれる箱にまとめて管理・実行できる仕組みです。
これを使うメリットは、どの環境でも同じようにアプリを動かせる点にあります。
例えば、私たちのチームでは4人中3人がWindows、1人がMacを使用していました。Dockerを使わない場合、異なるOS間での開発によって環境差異による不具合が発生する可能性があります。そうした問題を防ぎ、スムーズに開発を進めるためにDockerを採用しました。
ただ、Dockerは初心者にとってかなりややこしく、つまずきやすいポイントでもあります。実際に私も導入には苦戦しました(このあたりは後ほど詳しく触れようと思います)。
そうした試行錯誤をしながら環境構築を進めつつ、チーム開発では並行して役割分担も決めていきました。
その中で私は、DBを担当することにしました。というのも、これまでの学習ではDBの理解にどこか不完全燃焼な部分があり、この機会にしっかりと学び直してもう一度DB構築に挑戦したいと考えたためです。
開発の初期段階として、まずは環境構築から着手しました。使用する技術は、DjangoやGitHubなど、アプレンティスで学習したものに加えてDockerです。
しかし、ここで最初の課題に直面しました。以前Dockerを使用していた環境において、パソコンの不具合により、Windows上でDockerを動作させるために必要なWSL(Windows Subsystem for Linux)が破損していることが判明しました。そのため、環境構築に先立ち、WSLの復旧対応が必要となりました。
復旧方法の特定に時間を要し、結果として約1日を費やしましたが、最終的にはMicrosoftの公式ページから手動でインストールを行うことで、問題を解消することができました。
環境構築も終わり、本題のDB設計に入りました。必要なDBやカラムの構造、データの制約などをメンバーの方と擦り合わせて構築しました。
そのような中で、DB設計を進める際に非常に便利なツールを見つけたのでご紹介します。
それが「dbdiagram.io」です。
https://dbdiagram.io/home
このツールは、DBの構造を記述していくと、テーブル同士の関係性を自動で図として可視化してくれるものです。
そのため、データベースの構造を視覚的に確認しながら設計を進めることができ、開発において非常に役立ちました。
一方で、記述にはDBML(Database Markup Language)という独自の言語を使用するため、実際の開発環境であるDjango(Python)に合わせて書き直す必要がありましたが、それを踏まえても十分に有用なツールだと感じています。
そしてDB設計も終わり、いざマイグレーションをしようとしたその時、問題が発生しました!なんとwebコンテナが起動してくれません!どのようなエラーがでたのか確認してみると…↓
「entrypoint.shというファイルがないよ!」というエラーが発生しました。
このファイルは、Dockerコンテナ起動時の初期処理を実行するためのスクリプトです。
しかし実際には、該当のファイルは確かに存在していました。他の方のブログなども参考にしながら中身を確認しましたが、特に問題は見当たらず、原因が分からないまま2〜3時間ほど試行錯誤することになりました。
そこでChatGPTに相談したところ、「文字コードが原因ではないか」という指摘を受けました。確認してみると、ファイルの文字コードが「UTF-8 with BOM」になっていました。
BOM(Byte Order Mark)は「このファイルはUTF-8で書かれている」という目印ですが、シェルスクリプトの場合、このBOMがあることで先頭の #!/bin/sh(シバン)が正しく解釈されないことがあります。
その結果、スクリプトとして認識されず、ファイルが存在しているにも関わらず「見つからない」というエラーが発生していました。
文字コードを「UTF-8(BOMなし)」に変更して再度起動したところ、無事にコンテナが起動しました!深夜だったこともあり、思わず一人で喜んでしまいました。
その後、マイグレーションまで完了させ、チームに共有することができました。
🎉完成🎉
他のメンバーの方も最初はDocker環境の構築に苦戦していましたが、昼夜問わずdiscord上ですり合わせを重ねており、皆さん開発に熱を入れておりました!
そして二週間が経過し…
ついに完成しました!
自分が設計したDBがしっかり動作するか不安でしたが、機能してくれたみたいでよかったです。
さらにメンバーの方が実装したUIも操作がしやすく、問題なく機能していました。自分がすごいと感じた機能はレベルアップバーの実装です。タスクの難易度に応じて得ることができるポイントが異なるのですが、しっかりと獲得したポイントに応じてバーが溜まっていくようになっていました!
発表会当日
発表会当日は、チームの代表者がデモンストレーションおよびスライド発表を担当し、無事に終えることができました。
完成したプロダクトも問題なく動作し、これまでの取り組みの成果をしっかりと発揮できたと感じています。
sまた、もう一方のチームの発表も見学しました。
こちらのチームは対話型のゲームを制作しており、プレイヤー(平民)が王女と結婚するために、城にいる兵士や大臣、王様を説得していくというユニークな内容でした。
ストーリー性が高く、参加者全員で楽しめる非常に魅力的な作品であり、チーム開発の目標である「ワクワクするものを作る」という点を体現していると感じました。
その後は参加者全員でKPT(Keep/Problem/Try)を行いました。K:Keepではよかったことを、P:Problemでは問題点や改善したいことを、T: Tryでは次回どうしたいかということをそれぞれ挙げていきました。
今回の振り返りでは、KPTのフレームワークを用いて整理を行いました。
K(Keep)としては、チームメンバーが初期段階の方向性の整理やミーティング日程の調整、フロントエンド開発などを主体的に進めてくれた点が非常にありがたく、今後も継続していきたいと感じました。
一方で、P(Problem)としては、Docker環境の構築に多くのメンバーが苦戦していた点が課題として挙がりました。
T(Try)については、今回の取り組みが単発であったため明確な設定は行いませんでしたが、その代わりに挙がった課題に対して、どのように解決できるかを参加メンバー全員で議論しました。
アプレンティスを終えて
というわけで、12月から始まったアプレンティスも、あっという間に4ヶ月が経ち無事に終了しました。
これまでほぼ独学で学習してきた自分にとって、このような大規模なプログラムに参加するのは初めてで、当初はついていけるか不安もありました。
しかし、参加者の中には同じような悩みや不安を抱えている方も多く、交流を通じてそれらを解消できただけでなく、お互いに切磋琢磨しながら成長することができました。
加えて、独学で新しいことに挑戦するのはハードルが高いと感じる場面も多くあります。
学業との両立や、何から学ぶべきかという迷い、知識や技術の不足など、人それぞれに異なる壁があると感じました。
その点、本アプレンティスではそうした状況も考慮された環境が整っており、学習や開発を進めやすいプログラムであると実感しました。
新たな知識や技術の習得はもちろん、既存知識の復習、バグの対処方法、開発を効率化するツールの活用、チーム開発におけるコミュニケーション、さらにはエンジニアとしての姿勢など、多くの学びを得ることができた点は、自分の中で非常に大きな収穫でした。
そして何より、自分で書いたコードが意図した通りに動いたときや、エラーを解消して正常に動作した瞬間の達成感は、何にも代えがたいものがあります。
期間中は何時間も画面と向き合い、試行錯誤を繰り返すこともありましたが、それを乗り越えたときの喜びを実感できたことこそが、このアプレンティスに参加してよかったと心から思える瞬間でした。
最後に
最後までお読みいただき、ありがとうございました。本記事が、これから学習や開発に挑戦する方の参考や後押しになれば幸いです。今回の経験を糧に、今後もさらに成長できるよう取り組んでいきたいと思います。
Nさんの記事を読んで、今回の企画が「学びを実践につなげる場」になっていることを実感し、とても嬉しく感じました。
知識として学ぶだけでなく、実際に手を動かし、試行錯誤しながら挑戦することで、初めて得られる気づきや成長があります。
ホライズンテクノロジーでは、これからも「挑戦する人を増やす」ことを大切にし、一人ひとりの可能性を広げるきっかけとなる場を提供していきます。
この取り組みが、福岡・九州から新たな挑戦を生み出す一歩となれば嬉しいです。