はてなキーワード: ポインタとは
個人的には数学とかの言い回しに寄せればいいじゃないかと思います
前提として、「誰にでも同じ説明をして、かつ「例外」もふくめて伝えたい」のであればまず「誰」かを絞らなくてはいけないですよね。ふんだんな説明をする技術書でも読者に前提知識を想定しているように、前提知識を仮定してそれをクリアした人にのみ使えるのだと思います。
また、例外が言い尽くせるのなら「基本的にAはBです。ただしAはCであることもDであることもあります」式で行けますが例外が大量にあるのなら「AはBです。ただしAにはこれこれの性質を持ったものなら全て当てはまります」式で解決するしかないわけですよね。あるいはA(A以外にもあるけどあとで説明する)とか
で、一単語も例文のことを知らない私としては、すくなくとも書かれたことのみ伝えたいなら、
ポインタってどういうやつ?→ポインタが指すってどういうこと?→ブランチを指すポインタって何?(単なるコミットとは?)→gitとは?→gitにおけるHEADって?(HEAD以外にもあるらしい?)→gitにおけるHEADはブランチを指すポインタって結局何?→HEAD以外って何があり得て、具体的になにがあるんです?
の順番で説明してもらえると万人に伝わるかなと思いました。
意図が伝わってなかったらごめんなさい
プログラミングや、スポーツや、絵、音楽、とかやりたい人は多いが長続きが難しい系のことで、
これらの何かをはじめることを話すと、まあ過去にちょっとだけやったことがある人っていうのは出てくるんだけど
その中で一人か二人、諦めたけれど先輩風を吹かす人が出てくる。
例えばプログラミングでは、「俺も少し大学時代にやってたよー。ポインタ難しいよね。でもね難しいと思うけど諦めたら色々できると思うから。俺は諦めたけど…でも俺がやってた勉強法は~~~~」みたいな
特徴は
といったところだな
本当に序盤で躓いている。
(現在C言語から始める人も少ないと思うが、わかりやすいからC言語をたとえに出すが)
ポインタなんて難しいって言われているけど、序盤の序盤のボスみたいなもんじゃん。ドラクエ3でいうところのカンダタ
そこができてからようやくスタートラインというか、チュートリアルがおわったというか…
そのボスを倒してから、配列がつかえるようになったり、ヒープを理解できるようになったりして、ようやく実用的なものをつくれるようになるわけで
まあそこらへんで躓いている人がおおい。
プログラミングはやりたいと思う人が多いけど、その難しさに最初で辞めちゃう人もかなり多く、プログラミングに触ったことある人の比率はちょっとだけかじった人のほうが、普通にできる人より多いと思うわけだ。
何かネットの記事で見たけど、ギター買った人のうち1年以上続けている人は1割にも満たないそうだね。
それはそれでいいけど、その中の一部に謎の先輩がいるんだよなあ
↑を書いた元増田ですが、VBの話から派生した話で、やたらコマンドライン(以下CLI)を使った開発に否定的な人間がいて閉口した件。
そりゃ一口に開発と言っても色々なので、本当に統合開発環境(以下IDE)だけで開発するケースもあるのは、こっちも知ってるんだよ。
だから学習者の中で「何をやりたいか」が既に決まっているなら、CLIを全く触らずプログラミングを学ぶケースもアリということなのだろう。
1つ目は、そもそも「プログラムって何?」というレベルの人が「何をやりたいか」なんて決まっているわけがないので、最初から「何をやるか」を決めてかかるのはナンセンスという話。
むしろどういう開発に進んでもいいように、「等号は代入を意味する」辺りから始まって、どんなプログラミングでも基礎の基礎になる、データ構造とアルゴリズムを意識させることに集中させたい。
そのためには難易度低めで比較的潰しが効く言語を、できるだけシンプルな手順で作業できる開発環境で学べる方がいい。
そしたらPythonの実行環境とそこそこ以上の機能を持つテキストエディタを入れて、コマンドプロンプトとかPowerShellとかのCLIから"Helllo, world"が取っ掛かりだと思うわけ。
もしLinuxの環境が用意できるなら同じことをLinuxでも試してもらって、プラットフォームに依存しない開発の入り口くらいを知っておければベター。
いずれにせよ何かを実行する方法が1つではないという重要な知見は、できれば基礎のうちに知ってもらいたいことの1つだし、それはWindowsとLinuxとかCLIとIDEという対比がうってつけかなーと。
ちなみにIDEは、Pythonによる手続き型プログラミングに慣れた後のタイミングで学べばいいと思う。
そこまで行ったら変数の型や、クラスとオブジェクトとかの難しい話をGo言語で学んでおくことで、現場で使われているJava、C#、swiftへの移行もスムーズになりそうだし。
ちなみに「初心者コース」の最後、もし可能ならRustでポインタとメモリの話の触りくらいを体験してもらえると、組み込みに進む際のハードルが少しは下がるんじゃないかな。
もう1つは、いくら現場によってはIDEだけで開発する現実があっても、CLIを使った開発がどういうものかくらい、プログラマにとっては知ってて当たり前じゃねーの?という話。
もちろん「プログラマが何を知ってて当たり前なのか」は、時代の移り変わりとともにどんどん変わる。
大昔ならおそらく機械語とかが必須だっただろうけど、今なら機械語よりはHTMLを読めるほうが遥かに重要なわけで。
あと、UNIX系OSをパーティションごとに主要なディレクトリを分割してインストールしていた時代であれば、edエディタの使い方は必須だったと聞く。
(/binに入るエディタがedのみだったため、もし使えないとシステムクラッシュして/以外マウントできなくなったときに詰む)
でも今やそんなの完全に過去の話どころか、viとemacsの論争ですら多分古い方の問題になるだろう。
そういう過去の諸々も踏まえるとCLIが未来永劫、プログラマにとって常識的なナレッジだとは自分も思っていない。
でも今はまだ、プログラマを名乗るならCLIからコンパイルだ実行だくらいの基礎は知ってて当然だと思うんだが。
C++は全然詳しくないので、それこそSTLがどうこうみたいなのは正直分からない。
あくまでCとの比較なんだけど、一般的に難しい方の言語と言われるRustでも、Cのソースに比べたら全然読みやすいことにびっくりした。
特にポインタ周りの記述は、&とか*の書き方がCから少し変わっただけなのに、ぐっと読みやすくなってる件。
これならCやRustを使う上で絶対的に必要な、メモリの話も理解しやすいだろう。
なので先にRustを学んでおけば、後でCに取り掛かる際のハードルはだいぶ低くなりそう。
そうなると、今だと全くのゼロからプログラミングを学ぶなら順番としてはPython→Go→Rustになるのかな。
正直JavaやC#やSwiftは必要になってから学んでも遅くはないし、Goを知っていれば多分そこまで難しくない。
「かゆうま」みたいなノリで匿名日記を書くサイト作って1年が経った
去年の投稿で「今では日500人切れば緊急事態宣言解除してもいい流れになってたり」と書いていたが、今や日3000人超えてても行動制限なしでゴールデンウィークは各地が賑わうと、すっかり世界が変わってしまった。
日本ではまだマスク着用が多いが、マスク着用義務を廃止した国も出てきているし、来年の今頃はマスク着けないがスタンダードになっているかもしれない。
まあワクチン打ってる人も増えてるし、オミクロン株は弱毒化してるということで、ウィズコロナ時代になったのだろう。
このまま終息してアフターコロナになることを願いたい。
サイト的にはこの1年は穏やかだった。
大きなバズはないが、投稿数が減ることもなく、むしろちょっとずつ増えてる感もある。
長く投稿してくれてる人、新たに書き込んでくれる人などなど大変ありがたい。
今年の2月にはfaviconを作ってくれた人もいた。ちょうど見かけたのでサイトに設定した。嬉しい。
自分ごとでいうと、去年の6月に適応障害になってしまい半年ほど倒れていた。
ある日の午後、15分ほどの軽いオンラインミーティング後に「さて、作業するかー!…あれ何するんだっけ……」と頭が真っ白になった。
とりあえずその日は午後休をもらい休んだが、翌日になっても翌々日になっても思考がボヤボヤしたままだった。
「これはヤバいやつな気がする…」と思い心療内科に行ったところ診断が出て休職になった。
休み中はとにかく眠くて、日中も5時間以上昼寝して、夜も8時間以上寝るでとにかく寝ていた。
短期記憶が死んでいて、麦茶を沸かそうとしても湯を沸かしっぱなしにしたり、火は止めたけどティーバッグを入れ忘れたり、ティーバッグを入れたまま翌日まで放置したりと散々だった。
本や漫画を読もうにも前のページのことを忘れるし、プログラミングしようにも1行書くと次の行に何書こうか忘れる状態。
それまでの趣味も全然できず、麦茶を忘れないようにしたり、料理で食材や調味料を入れ忘れないので精一杯だった。
4ヶ月くらいして徐々に眠気も緩和し、思考・記憶も回復してきた。
少しやる気も出てきたので、リハビリを兼ねて前々から読みたいと思っていたビジネス書を読もうとしたり、忙しくてなかなか時間が取れてなかった資格勉強を再開しようとしてみた。
元々時間が出来たら読みたい本リストややりたいことリストを作っていたのだか、どれもいまいちピンとこなかった。
そんな中ある日、本屋に行ったときに手にとったのが「ゼロからのOS自作入門」だった。
時間がかかり、それでいて仕事への費用対効果はほぼ無い。あくまで自分のコンプレックスから興味があると思っているだけ。それだったら仕事に効きそうなことを優先しようと封印していた。
ポインタに触れるのが久しぶりすぎて15年以上ぶりにC言語ポインタ完全制覇を引っ張り出してきて復習したり、図書館でオペレーティングシステムの本を借りてきて読んだり、学生時代に戻ったみたいだった。(たぶん学生時代はこんなにポインタとかOSの本を読んでなかったと思う)
理解は追いつかなかったが、UEFIとEDK IIの存在を知ったこと、CPUにリングプロテクションや専用レジスタがあることを初めて知ったりなどなど、どんどん新しいことを知れてとても楽しかった。
仕事への効果はいまのところ感じられないし、おそらく今後も効果を発揮する場面はなさそうだ。
倒れている間はなかなかしんどかったけど、仕事やキャリアの面から「やりたいと思い込んでいたこと」と、仕事に全然効かないけど「人生の満足度が上がるやりたいこと」がクリアになったのはいい機会だった。
いまは休みの日に合間を見て「コンピュータシステムの理論と実装」をやってる。これも楽しい。ゆるゆる進めていきたいと思う。
サイトの方も引き続きゆるゆる続けていきたいと思う。
COVID-19流行下の日々を集団で記録する日誌 https://enigmatic-brushlands-82725.herokuapp.com/
例えばJavaScriptでリストをコピーするとき
const newList = list.slice();
しかし、
「なんで const newList = listじゃダメなんですか?」
と聞かれると非常に困る。
例えばconst a = 123と入っているときに、bにコピーしたかったらconst b=aで良い。
プリミティブと配列の違いとして覚えてもらう、という方法もあるけれど
じゃぁ文字列はどうなんですか?となると非常に困る。
JavaScriptだけを教えるならそれでも問題ないかもしれないが、Pythonも一緒に教えるとかなるとカオスになる。
結局のところ、コンピュータの仕組みを理解してもらって、メモリのアドレスとかポインタを知ってもらい
それからプリミティブや配列の話をしないと根本的には説明できない。
単純なプログラミング教育ってこの辺が破綻してると思っているので、結局はPCの構造と機械語・アセンブリ言語・C言語と順番に教える必要があると思っている。