会えない時のためにおはよう、こんにちは、こんばんは、おやすみなさい。エンジニアの佐久間です。
この記事は ギークフィード Advent Calendar 2025、19日目の記事です。
アドベントカレンダーもいよいよ終盤に差し掛かってきました。
昨今主流の盛り上がっているAI開発について、ギークフィードでもフルAI開発バトルという形でAWSの Kiro を利用したアプリケーション開発に取り組みました。
12/1~12/18 の記事に運営、参加者の取組内容が投稿されているので、ぜひ見てみてください。
本記事ではAIから少し離れ、自分が初めてプログラミングに触れたときの内容を振り返ってみようと思います。
目次
はじめに
エンジニア、特に開発領域に近いエンジニアは初めて触った言語やフレームワークを「親」だと思いこんでしまう特性があります。
これはこの職業において多くの人が通る道であり、エンジニアのあるあるネタとしても親しまれている内容です。
ずっと同じものを好きであり続ける方もいれば、仕事や趣味で大きく言語特性や方向が変わる方もいます。
自分にとって初めてプログラミングを体験し、「親」となった言語は Scheme でした。
出会い
以下のリンクを参照ください。
こちらは、自分の母校である釧路高専のシラバスになります。
当時、情報工学科では2年生の必修科目として「プログラミング言語I」という科目がありました。
この科目で習う言語が Scheme です。
当時とは講師もシラバスも異なりますが、扱っている言語や授業計画に大きい変更が無いことには感動を覚えます。
Scheme とは
Scheme(スキーム)は、1975 年に MIT で開発された Lisp 系のプログラミング言語です。
シンプルで美しい文法が特徴で、プログラミング言語理論や教育の分野で広く使われています。
主な特徴として以下が挙げられます
- ミニマルな構文:覚えるべき構文が非常に少なく、初学者にも優しい
- 関数型プログラミング:関数を第一級オブジェクトとして扱える
- 再帰処理が基本:ループではなく再帰で繰り返し処理を表現
- S 式(S-expression):すべてをリスト構造で表現する一貫性
教育用途として採用されることが多く、現に自分も授業の中で覚えました。
仕事で利用する機会は(少なくとも自分が知る中では)まずまず無いと思います。
言語としてかなりニッチなもので、名前を聞いたことがないというエンジニアも多いと思います。
以下に、Scheme の代表的な構文を簡単に解説します。
S 式(S-expression)
|
1 2 3 |
(+ 1 2) ; => 3 (* 3 4) ; => 12 (list 1 2 3) ; => (1 2 3) |
リスト操作(car, cdr)
- car(カー):リストの先頭要素を取得します
- cdr(クダー):リストの先頭以外の残りの部分を取得します
|
1 2 3 4 5 6 |
(define lst '(1 2 3 4 5)) (car lst) ; => 1 (cdr lst) ; => (2 3 4 5) (car (cdr lst)) ; => 2(2番目の要素) |
ペアの作成(cons)
|
1 2 3 |
(cons 1 '(2 3 4)) ; => (1 2 3 4) (cons 'a '(b c)) ; => (a b c) (cons 1 (cons 2 '())) ; => (1 2) |
変数、関数の定義(define)
define は、変数や関数を定義するための構文です。|
1 2 |
(define pi 3.14159) (define name "Taro") |
関数の定義
|
1 2 3 4 5 6 7 8 9 |
(define (square x) (* x x)) (square 5) ; => 25 (define (add a b) (+ a b)) (add 3 4) ; => 7 |
条件分岐(if、cond)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
(if (> x 0) "正の数" "0以下") (define (abs x) (if (< x 0) (- x) x)) (abs -5) ; => 5 (abs 3) ; => 3 (define (grade score) (cond ((>= score 90) "A") ((>= score 80) "B") ((>= score 70) "C") ((>= score 60) "D") (else "F"))) (grade 85) ; => "B" |
テスト
問題1
回答例
|
1 2 |
(define (x lst) (cons (car lst) '(new))) |
実行例
|
1 2 3 |
(print (x '(Ken Yumi Taro Mika))) => (Ken new) |
解説
- lst という引数を受け取る x という 関数を定義する
- car で lst の先頭を取得する
- cons で 2. の要素と、新しいリストを作成する
速度計測をしないという相違点はあるものの、提出方法自体は競技プログラミングに似たものを感じますね。
問題2
この操作を行う関数を定義しなさい。
回答例
|
1 2 3 4 5 |
(define (y lst) (if (null? lst) '() (cons (* 2 (car lst)) (y (cdr lst))))) |
実行例
|
1 2 3 |
(print (y '(1 2 3 4))) => (2 4 6 8) |
解説
- lst という引数を受け取る y という関数を定義する
- リストが空かどうかを null? で確認し、空なら空リストを返す
- そうでなければ、先頭要素を 2 倍にして、残りのリストに対して再帰的に処理を行う
- cons で結果を結合する
問題3
回答例
|
1 2 3 4 5 6 |
(define (z lst) (cond ((null? lst) '()) ((even? (car lst)) (cons (car lst) (z (cdr lst)))) (else (z (cdr lst))))) |
実行例
|
1 2 3 |
(print (z '(1 2 3 4 5 6))) => (2 4 6) |
解説
- lst という引数を受け取る z という関数を定義する
condを使って 3 つの条件分岐を行う- リストが空なら空リストを返す
- 先頭要素が偶数(
even?)なら、それを結果に含めて残りを処理 - それ以外(奇数)なら、その要素をスキップして残りを処理
- 条件に合う要素のみを
consで結合していく
というものです。
フィルタリング処理の基本パターンで、条件に応じて要素を取捨選択する方法を学びます。
オチ
実務での関数名は、「何をする関数か」が一目でわかるように、動詞を使って具体的かつ簡潔に名付けるのが基本です。
安直な関数名を付けた自分は、スルスルと成績を落とし赤点ギリギリで着地しました…。
おわりに
AI の台頭により直接コーディングする機会も徐々に減ってきた現在、自分にとっての原点を振り返るために書き起こしてみました。
当時は見たことも聞いたこともない言語に戸惑いましたが、今になって振り返ると覚えることや制限が少なく、はじめの一歩として非常に優秀な言語だったように感じます。
なかなか無いとは思いますが、プログラミング初学者にとって選択肢の1つとして覚えてもらえれば幸いです。
変数名、関数名は一目で意味がわかる名称を心がけましょう!
- 僕の初めては Scheme だった - 2025-12-19
- 【Kiro・Playwright】社内でフルAI開発バトル!!「1行も書かずに」Todoアプリを完成させた話〜sakumaの場合〜 - 2025-12-12
- 【入社エントリ】エンジニア6年生の転職活動 - 2024-12-20
【採用情報】一緒に働く仲間を募集しています



