Ace Citizenship
妻が米国市民権テストに合格するのを助けるために作った無料のiOSアプリです。彼女は合格しました。今では他の人が同じ夢を達成するのを助けています。
要約
妻が米国帰化テストの準備を始めたとき、私の基準を満たす学習アプリが見つかりませんでした。ほとんどが広告で溢れ、古いコンテンツを使用し、実績のある学習技術を無視していました。だから私は作りました。
Ace Citizenshipは、Duolingoを効果的にするのと同じ技術である間隔反復を使用して、公式USCISの公民128問すべてをカバーしています。妻はそれを使って勉強し、テストに合格し、アメリカ市民になりました。
アプリは完全に無料であり、今後も無料です。広告なし、サブスクリプションなし、裏はありません。収益よりも重要なことがあります。
原点の物語
私はAce Citizenshipを一人のオーディエンス、つまり私の妻のために作りました。彼女はUSCIS帰化テストに合格する必要があり、私は彼女が成功するための最高のツールを与えたかったのです。
市場の既存のアプリは期待外れでした。押し付けがましい広告が学習セッションを中断しました。サブスクリプションの有料壁が重要なコンテンツへのアクセスをブロックしました。デザインは後回しのように感じました。
私はもっとうまくできると分かっていました。だから、アプリ全体をゼロからデザイン、ブランディング、エンジニアリングしました - プロダクトデザインの経験と有用なソフトウェアを構築する情熱を組み合わせた愛の労作です。
アプリ
Ace Citizenshipは、プレミアムな価格なしでプレミアムな体験を提供します。インターフェースはクリーンで集中的で、あなたの時間を大切にします。
ビジュアルデザイン
私は統一感のある3Dビジュアル言語を作成しました。夢のような、楽観的で、明らかにアメリカ的なデザインで、勉強を退屈な作業から解放します。
すべてのイラストは、100,000枚以上の画像生成で洗練されたカスタムプロンプトを使用してMidjourneyで生成しました。柔らかいブルーとピンクのパレットは、愛国的なニュアンスを保ちながら落ち着きを感じさせます。
dreamofelectric.comで私のAI生成アートワークをもっとご覧ください。 dreamofelectric.com.
間隔反復
Ace Citizenshipの中核には、学習セッションを最適化する間隔反復アルゴリズムがあります。苦手な質問はより頻繁に表示され、習得した内容はより長いレビュー間隔で薄れていきます。
このエビデンスに基づいたアプローチは、保持力を向上させながら学習時間を大幅に短縮します。128問すべてを無心でレビューするのではなく、最も重要なところにエネルギーを集中させます。
アプリは進捗を追跡し、個々の学習パターンに適応し、インテリジェントで応答性の高いパーソナライズされた体験を提供します。
パーソナライズされた学習
USCISの質問の中には、居住州や議会代表など、特定の状況に依存する回答があるものがあります。Ace Citizenshipはこれらの質問を実際のテスト条件に合わせてパーソナライズします。
この細部へのこだわりにより、ユーザーは一般的な回答を暗記するだけでなく、テスト当日に必要な正確な情報を学ぶことができます。
技術実装
iOS向けに完全にSwiftUIで構築されたAce Citizenshipは、Appleの最新フレームワークを最大限に活用しています。アプリはローカル永続化にSwiftDataを使用し、ユーザーアカウントを必要とせずにiCloud経由でデバイス間で進捗が同期されます。
アーキテクチャは保守しやすく効率的です。USCISが公式リストを改訂すると質問バンクはシームレスに更新され、間隔反復エンジンは即座のフィードバックのために完全にデバイス上で実行されます。
AppleのHuman Interface Guidelinesに従うことで、アプリはネイティブで親しみやすく感じられます。ユーザーは新しい操作パターンを学ぶ必要がなく、学習に完全に集中できます。
裏側
アプリを効果的にするコードベースからの興味深いパターンをいくつか紹介します。
間隔反復アルゴリズム
コア学習エンジンは、あなたが苦手な質問を優先します。間違えると、そのカードは別のキューに入り、次の学習セッションに混ぜられ、マスターするまで難しい内容をより頻繁に見ることができます。
func completeCard(correct: Bool) {
if !currentSet.isEmpty {
let card = currentSet.removeFirst()
remainingCards -= 1
if correct {
cards.append(card) // Back to main deck
} else {
incorrectCards.append(card) // Priority requeue
}
}
}
func prepareNextSet() {
// Prioritize missed questions in next round
let incorrectCount = min(incorrectCards.count, 10)
let newCardsCount = 10 - incorrectCount
currentSet = Array(incorrectCards.prefix(incorrectCount))
incorrectCards.removeFirst(incorrectCount)
currentSet += Array(cards.prefix(newCardsCount))
}
州固有のパーソナライゼーション
アプリは50州とテリトリーのデータベースを維持し、現在の第119議会に更新されています。州を選択すると、上院議員、知事、首都に関する質問が実際のテスト条件に合わせてパーソナライズされます。
struct StateInfo {
let name: String
let senators: [String]
let governor: String
let capital: String
}
// Updated for 119th Congress (January 2025)
let stateInformation: [String: StateInfo] = [
"California": StateInfo(
name: "California",
senators: ["Adam Schiff", "Alex Padilla"],
governor: "Gavin Newsom",
capital: "Sacramento"
),
// ... all 50 states + territories
]
タイプセーフなテーマ
テーマシステムは、コンパイル時の安全性のためにSwiftのKeyPath機能を使用しています。静かに失敗する可能性のある文字列型の色参照の代わりに、すべての色アクセスがコンパイラによって検証されます。
struct Theme {
struct ColorSet {
let background: Color
let surface: Color
let onBackground: Color
let blue: Color
let green: Color
let red: Color
}
static func color(
_ keyPath: KeyPath<ColorSet, Color>,
for colorScheme: ColorScheme
) -> Color {
let colorSet = colorScheme == .dark
? darkMode
: lightMode
return colorSet[keyPath: keyPath]
}
}
// Usage: Theme.color(\.blue, for: colorScheme)
彼女は合格しました
妻はAce Citizenshipを使って帰化テストの準備をしました。彼女は合格しました。今日、彼女はアメリカ市民です。
その瞬間 - 彼女が帰化証明書を持ってUSCISオフィスで一緒に立っていた時 - 開発のすべての時間が価値あるものになりました。アプリは意図したとおりに機能しました。
他の人を助ける
妻の成功後、Ace CitizenshipをApp Storeで公開しました。5つ星の評価を獲得し、ユーザーはアプリが市民権テストの合格に役立ったと一貫して報告しています。
あるユーザーは書きました:「毎日30分、1ヶ月間このアプリで練習して合格しました!」このような話は、なぜ私がソフトウェアを作るのかを思い出させてくれます - 本当の人々のために本当の問題を解決するためです。
このアプリは、移民が米国市民になるという目標を一度に一つの学習セッションで達成するのを助け続けています。これは私がこれまでに出荷した中で最も個人的に意味のあるプロジェクトです。
感謝
Ace Citizenshipは、私がソフトウェア構築で愛していることを表しています:大切な人のために本当の問題を解決し、その解決策を世界と共有すること。
このプロジェクトでは、ニーズの特定からエクスペリエンスのデザイン、すべてのコード行の記述まで、製品ライフサイクル全体にわたって作業することができました。これは私の技術の純粋な表現です。
アプリは無料であり、今後も無料です。なぜなら、人々が故郷と呼ぶことを選んだ国の市民になるのを助けることなど、いくつかのことは収益よりも重要だからです。