はてなキーワード: C++とは
考えてみれば、1995年?Javaのアルファ版をダウンロードして、
Windows 95やLaser5のLinuxディストリビューションにインストールして、
大学サボってJavaのコード書くようになったんだよなぁ、長いわ…😟
その前はQuickCとかTurboCとか使ってた気がするけど、あんまり身につかなかったというか、
PC-9801でちょっとグラフィックスっぽいこと試すのも色々面倒というのもあったんで、
スプライト出して終わりみたいな感じだったんだけど、
Javaになったら2Dゲーム作れるし、3Dのゲームも作れるし、なんか一気に開けたんだよね、世界が
そのあと、逆にCとかC++も理解したり書けるようになったし、
まあ、Swingが出た当初は、訳あって実家のマシンを使うことになっちゃって、
それが当時はそこそこの性能だったはずで、プリインストールされてたバーチャロンもちゃんと動作したし、
それで遊んだりもしてたんだけど、Swing動かすのはつらかった…、AWTは軽いのになんで?と思った
でも、しばらくしてマシンも新調して、Swingもまともに動くようになったし、NetBeansは良くできてたよね
NetBeansの作者が書いてるAPI設計の本は、今でも名著にあがることがあるよね
で、話が現在になって、JavaFXが微妙なのは否めないんだけど、まあよくできてはいると思うし、
実例が少なすぎる気はするものの、試してみるかなぁ、と思ったり…
デスクトップアプリを楽に作る方法として、TauriとかElectronとかC#系とかも考えてるけど、
原点回帰でJavaしばらく気楽にやってみるのもいいかなぁ、と思ったのでしたまる…😟
GUIって、やっぱり日本語がちゃんと入力できないと駄目だよね
RustとかGoとかで、クロスプラットフォームなGUIあるけど、日本語入力が駄目な気がする
SDL上で独自GUI作って、日本語入力できるようにしたりとか、なんかつらかった思いであるし…
JavaはAWT、Swing、JavaFX、EclipseのSWT?だっけ、どれも日本語入力問題ないよね
そういえば、いつだったかMacOSXのアップデートでSWTが正常動作しなくなって、Eclipse全滅でAppleクソやなと思った思い出が…😟
行き先までの経路をC++で書くらしいよ
Adobe Flash Builder使ってた頃とかの方が、今より色々楽しかった気もする…😟
haXeでミニゲーム作ったりしてた時期もあったけど、ActionScriptって、初期の単純な仕様だったJavaみたいにシンプルなんで、
TypeScriptで書くときも似たように書いちゃうけど、C++もBetter Cっぽく書いたりしちゃうし、
新しい機能とか仕様とかめんどくさいんだよね、同じこと書けるなら古い仕様で書いてしまう…😟
ジョブズにFlash潰されたのは悔しいけど、JavaScriptで十分というか、Flash軽く凌駕する世界になったよなぁ
そういえば、Webアプリのビジュアルな機能をFlashにするか、まだWebブラウザに標準実装されてないCanvasにするかで争ったことがあって、
自分はFlash推しで、Flash本当に死んでからCanvas移行すればいいんでは?(その頃はThree.jsなんてないし、そんなの夢のまた夢の時代なんで)
上司にFlashなら3Dバリバリ使えますよ、って言ったんだけど、却下されたんだよね…😟
でも、Canvasで2D実装した方が、現状でもまだ動いてるし、上司とCanvas推しした人の判断は正しかった、俺は間違ってたんだな…
https://gakuzzzz.github.io/slides/for_loop_to_higher_order_functions/#1
これはオブジェクト指向でも同じでみんな「バグを減らすため」にいろんなパラダイムに挑戦してる
それ以外のHowだとかWhatだとかオブジェクトで世界を表すだとかどうでもいい
for文よりmapとかfilterの方がなぜバグが少ないか、というと「余計な操作が入りにくいから」
特にletで宣言してるような書き換え可能な変数っていうのはバグの温床
例でも挙がってるようなProductのpriceの書き換えでもfor文にするとどこかにletな変数を置かないといけない
そんでletな変数っていうのはうっかり消してしまったりうっかり書き換えてしまっても気付くことができない
だからconstで固めて何かしらのリスト処理をするときはmapなりfilterなりを使ってconstに固め直す(か、そのまま使う)
逆に言うとそういう処理がないならfor文使っても全然構わない
この書き換え不可能な変数を作るっていうのはCだとかC++だとかJavaだとかの頃からずーっと一緒でとにかく固めておきたい変数はfinal宣言して書き換えさせない
そうしないと、めちゃくちゃ分かりづらいバグが混入して無意味に1週間とか過ごすことになる
Product.priceを直接書き換えるのはいいの?っていう疑問があるかもしれないが
「そこまでせんでも致命的にはならん」
っていう感じで型のチェックだけするのがTypeScript
とにかくプログラミングに関する規則でHowだとかWhatだとかそういうフワフワしたこと言い出したら要注意
Programming proficiency necessitates a comprehensive understanding of multifaceted concepts, paradigms, and philosophies that underpin the art and science of software development. The Unix philosophy, with its emphasis on modularity, simplicity, and composability, serves as a foundational ethos for elegant code design. This philosophy advocates for creating small, focused programs that excel at singular tasks, facilitating the construction of complex systems through the judicious composition of these atomic units.
Proficient programmers must possess an encyclopedic knowledge of algorithms and data structures, enabling them to architect solutions with optimal time and space complexity. This encompasses a deep understanding of sorting algorithms (e.g., quicksort, mergesort), searching techniques (binary search, depth-first search), and advanced data structures (red-black trees, B-trees, Fibonacci heaps) The ability to analyze algorithmic efficiency using Big O notation is paramount for creating scalable solutions.
OOP principles—encapsulation, inheritance, and polymorphism—form the bedrock of modern software architecture. Mastery of design patterns (e.g., Singleton, Factory, Observer) and SOLID principles is crucial for creating maintainable and extensible codebases.
The FP paradigm, with its emphasis on immutability and pure functions, offers a powerful approach to managing complexity and facilitating parallel execution. Proficiency in higher-order functions, currying, and monads is essential for leveraging FP's full potential.
Expertise in language-specific advanced features, such as C++'s template metaprogramming or Python's metaclasses, allows for the creation of highly generic and reusable code. Understanding compiler theory and the ability to write domain-specific languages (DSLs) further expands a programmer's capabilities.
In an era of multi-core processors and distributed systems, mastery of concurrent programming models (e.g., actor model, communicating sequential processes) and parallel algorithms is indispensable. This includes proficiency in lock-free data structures, memory models, and synchronization primitives.
A deep understanding of computer architecture, operating systems, and memory management enables the creation of highly optimized, low-level code. This encompasses knowledge of cache coherence protocols, CPU pipeline optimization, and assembly language programming.
In an increasingly interconnected world, a thorough grasp of cryptographic principles, secure coding practices, and common attack vectors (e.g., buffer overflows, SQL injection) is crucial for developing robust and secure systems.
Proficiency in distributed version control systems (e.g., Git) and collaborative development practices (code reviews, continuous integration) is essential for effective team-based software development.
Advanced testing methodologies, including property-based testing, fuzzing, and formal verification techniques, are indispensable for ensuring software reliability and correctness.
In conclusion, the pantheon of programming knowledge extends far beyond mere syntax mastery. It encompasses a rich tapestry of theoretical concepts, practical skills, and philosophical approaches that, when harmoniously integrated, enable the creation of elegant, efficient, and robust software systems. The relentless pursuit of this multifaceted expertise is the hallmark of a truly accomplished programmer.
ある日、俺はとてつもない強さを持つ伝説の戦士から、現代社会に適応すべくITエンジニアになることを決意した。
理由は簡単、「ITってのは強そう」という噂を耳にしたからだ。
何でも、プログラムってやつを駆使して人間の生活を支配するらしい。
そんなわけで転職した俺だったが、最初から順風満帆とはいかなかった。
入社初日、先輩のプログラマーが俺に「まずはこのコードを読んで理解してください」と言ってきた。
だが、「int main()」の時点で頭が真っ白になった。
「何これ、意味わかんない」と正直に言ったら、先輩が「これがプログラムの入口です」と教えてくれた。
入口?それなら俺に任せろ。
意気込んで読み進めたが、if文の「条件分岐」という概念に遭遇して衝撃を受けた。
どうやら俺は、この「if」という謎の呪文と戦うことになりそうだ。
それは簡単な計算アプリだったが、実行ボタンを押した瞬間、エラーが100個以上出てきた。
「え、何で?」。
「ブロントさん、これデバッグしないと動きませんよ」と言われた。
「どこからエラーが出ているのか確認してください」と言われたので、「どこでもいい、俺がすべてを解決する」と豪語した。
が、実際にはセミコロンの付け忘れという初歩的なミスを指摘されてしまった。
「この程度のミスなど、俺の中ではノーカン」と誤魔化したが、内心めっちゃ恥ずかしかったのは言うまでもない。
ITエンジニアは、どうやら一人で全てを成し遂げるものではないらしい。
チームで開発するのが常識らしく、俺も例に漏れずプロジェクトに参加することになった。
だが、俺は気づいた。
「チーム」ってのは、つまりお互いのスキルを信じる必要があるということだ。
だが俺は信じられるのは自分だけだと思っていた……。
「CI/CD」「Docker」「REST API」……完全に魔法使いの呪文だな、と感じた俺は、「俺にはもっと物理的な仕事をくれ」と頼んだ。
しかし、どうやらこの世界では「物理的な力」よりも「論理的な力」が重要らしい。
悔しいが、俺は少しずつ「コードを書くという戦い方」を覚え始めた。
数か月後、俺はようやく小規模なアプリを独力で完成させることができた。
その瞬間、気づいた。
剣で敵を斬るように、コードでエラーを倒し、社会の問題を解決する。
今では、俺のエンジニア仲間から「戦士系エンジニア」として頼りにされるまでになった。
強さとは何かを語るなら、それはただの力ではない。
しかし、俺はこうしてエンジニアという新たなフィールドで生き抜いている。
これからも新たな言語や技術に挑み、デバッグという名の強敵と戦い続けるだろう。
なぜなら、俺はブロントさん。
白菜は四分の一で159円
かといって発達障害持ちなので転職したところで面接にそもそも受からない
人事も発達障害に苦しめられてきたせいか何となくではあるが、分かるようになってる
持ってるスキルは
ぐぐってみると、発達障害もちは最低賃金でもまだマシな方らしい。
医者の給料なら、まだできるだろうけど、この賃金で、賃金アップも見込めない状況で、どーすりゃいいんだよ。
南千住のスーパーまわったけど、安い野菜は軒並み売り切れて、高い野菜しか残ってない。
医者は患者に低所得者層が混じってることを理解せず、なぜ野菜が買えないのか理解しようとしない。
まじイライラする。
プログラミング知識完全ゼロの状態から趣味でC++をやり始めて数年が経った。
ポインタだのテンプレートだのデザインパターンだのややこしそうなものに一通り触れてみて多少は理解できたと思う。
ただ実際に何か作ろうと簡単なゲームなんかに手を出すとマジックナンバーがどんどん出てきてしまったりして本当にただのサンプルみたいな拡張性の無いものになってしまう。
各機能の独立性を保って責任範囲をはっきりさせようとかマップや敵モンスターを自動生成してリプレイ性を上げようみたいに頑張って意識高いことを考え出すと作業量が膨大になってしまい終わる気がしない。
そんな感じで向いてなさそうに思えてきたのでそろそろ潮時なのかもしれない。
成果としてはUnityやUnreal Engineの偉大さを実感として知ることができたということだけかもしれない。
今までのキャリアで後悔があるとするなら、CやC++での開発に業務で関わらなかったことである。
現在ミドルウェアでシェアがあるものはCやC++で書かれてるのもが多いように思う。未だに新しく出るものを見てもそのようなものがある。
一般的にインターネットのサービス開発においては、LL系やGoやTypeScriptなどで開発されるので、Cなどで開発する機会は今やほぼ無いはずであり、私も通ってこなかった。
しかしGitHubで著名なDBやKVSを見るとCで書かれていたりして、コードリーディングが捗らなく歯痒い思いをするのである。
さらに昨今パブリッククラウドを使った開発がよくあるだろうが、難しいことは大体API越しに隠蔽してくれているのである。
そしてパブリッククラウドの事業者は、その難しいことを実現するのに、前述のミドルウェアをホストしたり、拡張したり、時には自前で作るわけであるが、そこでもCなどは出てくるのであろう。多分。
OS開発やチップ開発みたいに、同じインターネット業界でも、パブリッククラウド、ミドルウェア、CDN事業者などは一種のレイヤーというか違う業界になってると思う。
要はそこに1エンジニアとして見たときに、C言語などが一種の参入障壁になってると思ってて、平凡なWebエンジニアには近いようで遠い世界に見えるのである。
そして、うまく表現出来ないが、特にパブリッククラウドの上に乗っていると、エンジニアとして相対的に価値が下がっていくような感覚に苛まれる。
APIを叩くだけで楽だが、その向こうには難しいアルゴリズムやオンプレのサーバーがあるわけで、そういう知識はどんどん向こう側に蓄積されていくのである。
とはいえ、それで顧客に価値が届いて事業が成立するのであれば、それはそれで構わない。
とりとめのない内容ではあるし、生成AIやLLMの進歩により、このような悩みが杞憂になる可能性もあるが、あと30年どうやって生き延びていけばいいか悩んでいる。
オーディオプログラミングするなら言語はC++がメジャーらしい。JUCEというVST(DTMソフトのプラグイン)とか作るやつがC++なのもある。「音」が波形で時系列に並んでるから低レベルよりの言語が向いてるんだろうか。
SoundFontの取り扱い02 – SoundFontのフォーマット | C++でVST作り
ttps://github.com/FluidSynth/fluidsynth というのもある
(VSTは高いのだと何万とかするけど儲かるんだろうか)
https://survey.stackoverflow.co/2018#technology
https://survey.stackoverflow.co/2020#technology
https://survey.stackoverflow.co/2022/#technology
https://survey.stackoverflow.co/2024/technology
- | 2018 | 2020 | 2022 | 2024 |
JS | 69.8 | 67.7 | 65.36 | 62.3 |
Python | 38.8 | 44.1 | 48.07 | 51 |
TS | 17.4 | 25.4 | 34.83 | 38.5 |
JAVA | 45.3 | 40.2 | 33.27 | 30.3 |
C# | 34.4 | 31.4 | 27.98 | 27.1 |
C++ | 25.4 | 23.9 | 22.55 | 23 |
C言語 | 23.0 | 21.8 | 19.27 | 20.3 |
PHP | 30.7 | 26.2 | 20.87 | 18.2 |
Go | 7.1 | 8.8 | 11.15 | 13.5 |
Rust | - | 5.1 | 9.32 | 12.6 |
kotlin | 4.5 | 7.8 | 9.16 | 9.4 |
Ruby | 10.1 | 7.1 | 6.05 | 5.2 |
Swift | 8.1 | 5.9 | 4.91 | 4.7 |
Scala | 4.4 | 3.6 | 2.59 | 2.6 |
変化がわかりやすいように2年ごとにした
JAVAって永遠に人気なのかと思ったけど、10年後人気言語と言えなくなってるかも
PHPはそろそろ厳しい
C#も地味に衰退