ASK

Swift

Firebase

プログラミング初学者とメンターとを繋ぐプログラム質問アプリ

Atsushi Hosaka

推しアイデア

プログラミング初学者は1人での開発につまづきがちです。ASKでは、通常のチャットアプリではできない効率でメンターや友達にプログラムの質問ができます。

作った背景

私は中高生にプログラミングを教えていますが、家で開発してる最中に起きたエラーを通常のチャットアプリでの会話で解決することは難しいため。

推し技術

SwiftUI、Firestoreを用いてmacOS・iOS共用が可能なアプリとして開発しています。

プロジェクト詳細

このアプリ「ASK」はプログラミング初学者が、メンターや友達にプログラミングの質問を効率的にすることができるチャットアプリです。

チャット機能

通常のチャットアプリでは、プログラムを送っても可読性が著しく低いという問題点がありました。 また、初学者にとってはどのコードがエラーを起こしているのかを見つけるのも難しいことが多く、関係のないコードが送信されることも多々ありました。

ASKでは、PC上にあるプログラムファイルを取得し、そのまま送信することが可能です。 image image

送信したユーザーにはコードが小さく表示され、受信したユーザーにはコードが大きく表示されるため、可読性が上がっています。 image image

また、コードのどこを修正すればいいかを明確にするため、コードの修正前と修正後を同時に送信できる機能を実装しました。 image

メッセージを右クリックして「返信」ボタンを押すと、自動で修正前にコードが入力されるようになっています。 image

ユーザーのログイン/サインアップ機能も実装されています。 image image

どのユーザーを質問に追加するかを簡単に選択できます。 image

機能面

ASKはSwiftUIとFirestoreを用いて開発されています。 SwiftUIを用いたことでマルチプラットフォームとして実装されており、iOS版も展開も可能です。

MVVMアーキテクチャを採用し、今後の開発でも機能を追加しやすくなっています。 image

Firebaseとの連携ではasync/awaitを用いた非同期処理を実装しています。

FirestoreAPI

class FirestoreAPI { static private let db = Firestore.firestore() static func fetchUsers(for query: String) async throws -> [User] { let snapshot = try await db.collection("users") .whereField("name", isGreaterThanOrEqualTo: query) .whereField("name", isLessThanOrEqualTo: query + "\u{f8ff}") .getDocuments() var users = try snapshot.documents.compactMap { try $0.data(as: User.self) } for index in users.indices { users[index].imageData = await FirebaseStorageAPI.fetchImageData(from: users[index].imageName) } return users } ...

ログイン状態を端末に保存する機能 LoginManager

class LoginManager: ObservableObject { static var shared = LoginManager() private static let userEmailKey = "savedUserEmail" private static let userPasswordKey = "savedUserPassword" private static let userUIDKey = "savedUserUID" static func saveUser(uid: String, email: String, password: String) { UserDefaults.standard.set(uid, forKey: userUIDKey) UserDefaults.standard.set(email, forKey: userEmailKey) UserDefaults.standard.set(password, forKey: userPasswordKey) } static func loadUserUID() -> String? { return UserDefaults.standard.string(forKey: userUIDKey) } ...

今後の展望

macOS/iOSネイティブのアプリである点

前述の通り、ASKはプログラミング初学者がどこにいてもスムーズに学習を進められる最良の体験を届けるために作られています。ネイティブのアプリとして実装しているため、前述のファイル取得等の機能はもちろん、通知機能やgitとの連携機能を実装していくことで、質問への返答にかかる時間を最小限にし、無理な変更をさせないよう誘導することができます。

教育機関への提供

私は現在中高生にプログラミングを教えるアルバイトをしているので、実際にその活動の中でASKを用いようと考えています。 さまざまなメディアや既存のチャットアプリのグループの引き継ぎなどが実装できれば、同じアルバイトをする全員がこのアプリを使うことができます。 Web版を開発すれば、mac/windows関係なくこのUIを用いることができるようになり、プログラミング学習サービスにUIを提供することで規模をより拡大していけると考えています。

Atsushi Hosaka

@626887366ee5d1ef